假设我想使用另一个变量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:我似乎不了解smth何时展开/评估,以及展开变量是如何分组为传递给脚本的参数的。
谢谢!
额外的好奇心是为什么result="$(some-command \"$argument\")"根本不起作用。
发布于 2021-03-02 17:18:29
在bash中,引用和扩展就是这样工作的。实际上,不需要在=之后使用双引号,因为不执行分字操作,所以
result=$(some-command "$argument")应该以同样的方式工作。
没有“连接”发生。Bash将$()中的字符串视为一个命令,并在运行它之前运行它上的所有扩展。
那么,some-command "$argument"会发生什么呢?首先,参数展开将$argument扩展为包含空格的字符串。当分字发生时,它注意到字符串是用双引号括起来的,所以它把它保持为一个字符串。
https://stackoverflow.com/questions/66443833
复制相似问题