在 Bash 中,数组a=( 11 22 )
和b=$(echo "11 22")
打印时的行为有所不同。
$ a=( 11 22 )
$ b=$(echo "11 22")
$ echo $b
11 22
$ echo $a
11
如果我们想打印 的完整内容,a
我们必须将其打印为 ${a[*]}
,而不是$a
.
如何解释通过括号进行数组赋值和通过命令替换进行数组赋值之间的这种行为差异?
答案1
感谢@cas 的以下注释:
$b 不是数组,它是包含“11 22”的字符串
相当于
a=( 11 22 )
是
b=($(echo "11 22"))
因此
$ a=( 11 22 )
$ b=($(echo "11 22"))
$ echo $a
11
$ echo ${a[*]}
11 22
$ echo $b
11
$ echo ${b[*]}
11 22
答案2
对于数组(比方说arr
),仅使用通常的变量引用表示法引用数组$arr
类似于${arr[0]}
即 this 引用数组的第一个元素。这就是你的情况所发生的情况。
如果你想引用数组的所有元素,你几乎总是想使用"${arr[@]}"
,而不是"${arr[*]}"
。因为,在后一种情况下,当像这样引用时,元素将显示为单串以 的第一个字符IFS
作为分隔符,默认情况下(当IFS
是空格、制表符、换行符时),空格成为分隔符。
在未加引号的情况下${arr[@]}
,它将扩展为数组的所有元素,并进一步进行分词和路径名扩展。
这是一个供您参考的示例:
$ a=( 11 22 )
$ printf '%s\n' "$a"
11
$ printf '%s\n' "${a[0]}"
11
printf '%s\n' "${a[*]}"
11 22
$ printf '%s\n' "${a[@]}"
11
22
现在,在 的情况下b=$(echo "11 22")
,您只需执行命令替换并在其中运行echo "11 12"
(在子 shell 中),结果将保存在变量 中b
,这不是一个数组。因此,你得到11 12
when echo
-ing $b
。
请注意,变量赋值的右侧不会经过分词,因此即使字符串之间有空格,字符串11 12
也会保存到变量中。b