Tim*_*gan 13 bash shell quotes command-line-arguments
我正在尝试将包含多个引用单词的字符串变量替换为命令的参数.
因此,给出以下示例脚本(注意shebang中的-x,这会导致输出记录到stderr),
#!/bin/bash -x
myArg="\"hello\" \"world\""
echo "string is:" $myArg
exit
Run Code Online (Sandbox Code Playgroud)
这给了我们,
+ myArg='"hello" "world"'
+ echo 'string is:' '"hello"' '"world"'
string is: "hello" "world"
+ exit
Run Code Online (Sandbox Code Playgroud)
第二行显示实际传递给命令的内容; bash为字符串中的每个单词添加了单引号.如果我改为引用"$ myArg",那么对于整个字符串而不是每个单词都会出现相同的情况.
现在,想象一下echo,我们将字符串传递给一个程序,其中一些参数需要引用模式,例如"*"(不能由shell扩展).
为了澄清,我不希望在扩展期间添加单引号.我怎么能实现这个目标?
Gor*_*son 16
不要使用引号,使用数组(参见BashFAQ#050):
$ myArgs=("hello" "world" "multiword arg with * ?")
+ myArgs=("hello" "world" "multiword arg with * ?")
$ echo "${myArgs[@]}"
+ echo hello world 'multiword arg with * ?'
hello world multiword arg with * ?
Run Code Online (Sandbox Code Playgroud)
如果它确实需要以字符串中的引用字符串的形式出现,那么你要么必须使用类似的东西eval "echo $myArg"(如果你不小心,可能会导致一些非常讨厌的错误)或自己解析(这是会变得很困难).
如果要将变量值作为参数传递(99%的情况在SO上),只需使用正确的引用:
arg="foo bar"
command "$arg"
Run Code Online (Sandbox Code Playgroud)
如果要传递多个参数,请使用数组:
args=("foo bar" "baz ban" bay)
command "${args[@]}"
Run Code Online (Sandbox Code Playgroud)