假设我想通过$()
调用一些命令some-command
,其参数存储在另一个变量argument
中,后者包含空格。
-
根据我目前的理解,
result="$(some-command $argument)"
(例如扩展)导致传递两个参数的事实是预期的。 -
问题部分:为什么
result="$(some-command "$argument")"
(例如串联)会导致传递一个单个参数的预期结果?
更多细节:
./some-command
:
#!/usr/bin/env bash
echo "Arg 1: $1"
echo "Arg 2: $2"
./test-script
:
#!/usr/bin/env bash
export PATH="`pwd -P`:$PATH"
argument="one two"
echo "Calling with expansion"
res="$(some-command $argument)"
echo $res
echo "Calling with concatenation"
res="$(some-command "$argument")"
echo $res
调用test-script
将导致以下输出:
Calling with expansion
Arg 1: one Arg 2: two
Calling with concatenation
Arg 1: one two Arg 2:
我似乎不明白什么时候展开/求值,以及如何将展开的变量分组为传递给脚本的参数。
谢谢!
注:额外的好奇是为什么result="$(some-command "$argument")"
根本不起作用。
这就是bash中引用和展开的工作方式。实际上,在=
后面不需要双引号,因为不执行分词,所以
result=$(some-command "$argument")
应该以同样的方式工作。
没有"concatenation"在继续。Bash将$()
中的字符串视为命令,并在运行它之前对其进行所有扩展。
那么,some-command "$argument"
发生了什么?首先,参数展开将$参数展开为包含空格的字符串。当分词发生时,它注意到字符串被括在双引号中,因此它将其保持为单个字符串。