在Bash中通过连接将扩展变量作为另一个命令的参数



假设我想通过$()调用一些命令some-command,其参数存储在另一个变量argument中,后者包含空格。

  1. 根据我目前的理解,result="$(some-command $argument)"(例如扩展)导致传递两个参数的事实是预期的。

  2. 问题部分:为什么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"发生了什么?首先,参数展开将$参数展开为包含空格的字符串。当分词发生时,它注意到字符串被括在双引号中,因此它将其保持为单个字符串。

最新更新