我需要运行类似的东西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,b
mycommand
-f
a,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"