Bash引号禁用转义

4

我希望在我的bash脚本中运行一些命令,让我们把它命名为 "test" 并从bash变量中传递一些参数。

我的脚本:

#!/bin/bash -x
PARAMS="-A 'Foo' -B 'Bar'"
./test $PARAMS

我有:

+ PARAMS='-A '\''Foo'\'' -B '\''Bar'\'''
+ ./test -A ''\''Foo'\''' -B ''\''Bar'\'''

这是错误的!

另一个案例:

#!/bin/bash -x
PARAMS='-A '"'"'Foo'"'"' -B '"'"'Bar'"'"
./test $PARAMS

结果也很令人沮丧:

+ PARAMS='-A '\''Foo'\'' -B '\''Bar'\'''
+ ./test -A ''\''Foo'\''' -B ''\''Bar'\'''

所以问题是 - 我如何将bash变量用作某些命令的命令行参数。 变量类似于“-A 'Foo' -B 'Bar'”(确切地说是带有单引号) 结果必须调用程序“./test”,并使用参数“-A 'Foo' -B 'Bar'”像这样:
./test -A 'Foo' -B 'Bar'

谢谢!


可能我必须在 #!/bin/bash 中加入一些参数,比如我添加的 "-x",以查看原始命令。 - Ivan Pomortsev
如果您只是回显第一个,则格式就正确了。-x 只是显示 bash 如何看待它,而不是您的脚本。 - 123
1个回答

10

使用BASH数组来存储完整或部分命令行更加安全,例如:

params=(-A 'Foo' -B 'Bar')

然后将其称为:

./test "${params[@]}"

这将与以下内容相同:

./test -A 'Foo' -B 'Bar'

1
好的!非常感谢。它很有帮助! - Ivan Pomortsev
很高兴知道它起作用了,您可以通过点击我的答案左上角的勾号将其标记为已接受的答案。 - anubhava
3
不仅更安全,这正是在Shell中存在数组的原因。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接