使用带双引号的值变量作为命令参数,但不带单引号

使用带双引号的值变量作为命令参数,但不带单引号

我需要运行类似的东西mycommand -f "a","b"

但我需要在这种 bash 脚本中运行它:

p="\"a\",\"b\""

mycommand -f "$p"

但是如果我运行这个脚本,启动的命令是

mycommand -f '"a","b"'

并不是

mycommand -f "a","b"

如何$p在不带单引号的情况下作为参数?

答案1

如果您在命令行上运行,则与运行, 或mycommand -f "a","b"相同。 shell 删除了引号,作为参数的是两个字符串和,其中不带引号。mycommand -f "a,b"mycommand -f a,bmycommand-fa,b

现在,如果您想将后者放在变量中,只需将其存储在不带任何额外引号的变量中,并将其与"$var".当然,您可以在分配值时使用引号,这些引号将被删除,就像直接将带引号的字符串作为命令的参数给出一样。

var="a","b"         # or
var="a,b"           # or
var=a,b             
mycommand -f "$var"

当然,如果该值实际上是例如foo bar, this that带有空格,或者包含 shell 特殊的其他字符,那么您至少需要一些引号:

var="foo bar, this that"
mycommand -f "$var"

如果你有:

p="\"a\",\"b\""
mycommand -f "$p"

然后,在处理引号和转义符之后,变量p将包含"a","b",并且 的参数mycommand也将是该确切的字符串。这是与之前不同的字符串。

对于set -x、Bash、ksh 和 zsh 会将其显示为mycommand -f '"a","b"',因为它们以以下格式显示参数作为 shell 的输入有效,并且包含双引号的字符串需要一些引号。反斜杠可以工作,但这些 shell 更喜欢在此处显示单引号。

(另一方面,例如 Dash 不会这样做,它set -x会打印出不明确的输出,而这些输出在往返过程中不会完好无损。)

答案2

我觉得非常非常愚蠢。

我的命令是这样运行的mycommand -f "a","b"。如果我在没有双引号的情况下运行它 - mycommand -f a,b- 它不起作用。

因此,我在变量中添加了转义双引号:p="\"a a\",\"b\""

我必须更精确,我有一些空白,真正的命令是mycommand -f "a a","b".

我发现我必须学习:没有必要添加引号作为变量值,bash 对我来说一切都是正确且神奇的。

我设置了p="a a,b",然后我就可以简单地运行mycommand -f "$p"

相关内容