我认为@gniourf_gniourf 关于将字符串存储在变量中的初始评论基本上是正确的(即使您只是尝试存储命令参数);请参阅BashFAQ #050:我正在尝试将命令放入变量中,但复杂的情况总是失败!.
现在,你有两个困惑。首先是您误解了-x
打印的模式。它不会打印您正在运行的命令的参数,它会打印一个将传递相同 arguments的命令。在这种情况下,一些参数包含单引号,因此它给出了一个带引号和转义的字符串,在去除引号后,将产生与实际传递的参数相同的参数。例如,参数之一是'af
,因此 -x 模式将其显示为$'\'af'
。
其次,您似乎正在尝试在变量中嵌入单引号,以便您可以将多个单词作为单个参数传递给 functionTest(即您正在尝试运行相当于functionTest -CMD 'af -i 3 -a'). If I'm right about what you're trying to do, you're doing it fundamentally wrong. When the shell parses a command line, it interprets quotes and escapes, *then* substitutes variables. It'll go back and split the replaced variables into words, but it will not go back and pay attention to quotes and escapes in the substituted text. So when it replaces
$buff with
-CMD 'af -i 3 -a'`,它将它分成 5 个参数:“-CMD”、“'af”、“-i”、“3”和“-a'”。请注意,单引号被视为第二个和第五个参数,而不是包含一个长参数:
$ buff="-CMD 'af -i 3 -a'"
$ printargs $buff
Got 5 arguments:
«-CMD»
«'af»
«-i»
«3»
«-a'»
为了在没有这种混淆的情况下存储多个参数,您需要使用一个数组(再次参见@gniourf_gniourf 的评论和BashFAQ #050):
$ buff=(-CMD 'af -i 3 -a')
$ printargs "${buff[@]}"
Got 2 arguments:
«-CMD»
«af -i 3 -a»
顺便说一句,如果你想复制这个,你需要 printargs。这是我写的一个非常简单的 shell 脚本来澄清这样的情况:
#!/bin/sh
echo "Got $# arguments:"
for arg; do
echo " «${arg}»"
done