Bash 在命令替换后不进行单词扩展

Bash 在命令替换后不进行单词扩展

摘自 GNU Bash 手册第 3.5.7 节:分词

shell 扫描双引号内未发生的参数扩展、命令替换和算术扩展的结果,以进行分词

这意味着(?)ARRAY=$(echo "a b c")将导致ARRAY分配一个由三个单词组成的数组,即:abc

尽管如此,它最终ARRAY被分配了一个单词:"a b c"。为了真正触发单词拆分,需要将赋值语句的右侧表达式括在括号中:ARRAY=($(echo "a b c"))

这些括号虽然看起来没什么用,但却能引导 bash 进入不同的行为。手册错了吗?我没理解什么?

答案1

啊,这很有趣。

摘自 GNU Bash 手册第 3.4 节:参数

可以通过以下形式的语句来分配变量

名称=[值]

所有值都经过波浪号扩展、参数和变量扩展、命令替换、算术扩展和引号删除(详见下文)。[…]未进行分词,但“$@”除外,如下所述。不执行文件名扩展。

我注意到,如果分词执行完上述代码后,你仍然不会得到一个数组。你最终会得到三个单词:

ARRAY=a b c

因此,您应该已经分配给aARRAY然后 shell 会尝试将其解释b为要执行的命令,并将c其作为传递给它的第一个参数。

关于你后面的例子……

ARRAY=($(echo "a b c"))

…需要使用括号来指定这是一个数组文字,而不是一系列需要单独解释的单词。您不能为此使用引号,因为那会使其成为字符串"a b c"而不是数组(a b c)

这涵盖第 6.7 节:数组

使用以下形式的复合赋值来分配数组

名称=(值1值2…)

相关内容