shell 扫描双引号内未发生的参数扩展、命令替换和算术扩展的结果,以进行分词
这意味着(?)ARRAY=$(echo "a b c")
将导致ARRAY
分配一个由三个单词组成的数组,即:a
、b
和c
。
尽管如此,它最终ARRAY
被分配了一个单词:"a b c"
。为了真正触发单词拆分,需要将赋值语句的右侧表达式括在括号中:ARRAY=($(echo "a b c"))
。
这些括号虽然看起来没什么用,但却能引导 bash 进入不同的行为。手册错了吗?我没理解什么?
答案1
啊,这很有趣。
可以通过以下形式的语句来分配变量
名称=[值]
所有值都经过波浪号扩展、参数和变量扩展、命令替换、算术扩展和引号删除(详见下文)。[…]未进行分词,但“$@”除外,如下所述。不执行文件名扩展。
我注意到,如果分词有执行完上述代码后,你仍然不会得到一个数组。你最终会得到三个单词:
ARRAY=a
b
c
因此,您应该已经分配给a
,ARRAY
然后 shell 会尝试将其解释b
为要执行的命令,并将c
其作为传递给它的第一个参数。
关于你后面的例子……
ARRAY=($(echo "a b c"))
…需要使用括号来指定这是一个数组文字,而不是一系列需要单独解释的单词。您不能为此使用引号,因为那会使其成为字符串"a b c"
而不是数组(a b c)
。
这涵盖第 6.7 节:数组。
使用以下形式的复合赋值来分配数组
名称=(值1值2…)