【问题标题】:Bash pass variable as argument with quotesBash 将变量作为带引号的参数传递
【发布时间】:2016-09-20 08:20:28
【问题描述】:

假设./program是一个只打印出参数的程序;

$ ./program "Hello there"
Hello there

如何正确地从变量中传递带引号的参数?我正在尝试这样做;

$ args='"Hello there"'  
$ echo ${args}  
"Hello there"  
$ ./program ${args}  
Hello there # This is 1 argument

但是,当我遍历一个变量时,args 中的引号似乎被忽略了,所以我得到了;

$ args='"Hello there"'
$ echo ${args}
"Hello there"
$ ./program ${args}
"Hello there" # This is 2 arguments

是否可以让 bash 将引号视为我自己在第一个代码块中输入它们?

【问题讨论】:

  • ./program "${args}"
  • @redneb 试过了,它仍然将其视为 2 个参数("Hellothere"
  • 然后program 坏了。
  • 你怎么知道(或者你为什么认为)program"$args" 的扩展视为两个参数?
  • @chepner 我的评论是错误的。它确实将其视为单个 arg,但由于某种原因,当您通过变量时,arg 为 "Hello there",而当您通过命令行时,arg 为 Hello There。无法弄清楚如何绕过这些报价(请参阅下面的答案中的我的 cmets)

标签: linux bash


【解决方案1】:

我不知道你从哪里得到program,但它似乎坏了。下面是用 bash 编写的正确方法:

#!/bin/bash

for arg in "$@"; do
    echo "$arg"
done

这会将每个参数打印在单独的行中,以便于区分(当然,包含换行符的参数会出现问题,但我们不会传递这样的参数)。

将上面的内容保存为program并赋予它执行权限后,试试这个:

$ args='"Hello there"'
$ ./program "${args}"
"Hello there"

$ args='"Hello there"'
$ ./program ${args}
"Hello
there"

【讨论】:

  • 知道了,但问题是如果我手写出来,我会得到不同的结果。 ./program "Hello there" 是一个不带引号的参数,而./program "${args}" 是一个带引号的参数。明白我在说什么吗?前者产生Hello there,而后者我得到"Hello there",它们的论点不同
  • 然后试试这个./program '"Hello There"'
  • 我需要去掉变量形式的引号,而不是相反。这样我就可以运行./program "${args}" 并获得与./program "Hello there" 完全相同的输出
  • 如果变量包含引号,您必须修改变量,或者首先不将它们包含在变量中。
  • @user2249516 在这种情况下,可能最简单的解决方案是使用xargs:echo "$args" | xargs ./program。或者使用eval:eval './program "$args"'
猜你喜欢
  • 2023-03-03
  • 2018-05-25
  • 2023-04-02
  • 2015-12-26
  • 2015-03-11
  • 1970-01-01
  • 2015-10-29
  • 2013-02-09
相关资源
最近更新 更多