为什么 Bash 不用新数组覆盖我的数组?

Why doesn't Bash overwrite my array with a new one?

我将我的用例剥离到这 3 行(加上输出):

A=(foo bar)
A=$(echo "spam egg")
echo ${A[@]}
spam egg bar

它创建一个包含两个手写元素的数组。然后一段时间后,我想用命令行工具(例如 ls *.vhd)的输出替换我的数组。 Bash 不替换数组,只替换第一个元素,所以 bar 在最后得到 "attached"。

如果我使用另一个手写数组,则无法重现此行为。

A=(foo bar)
A=(spam egg)
echo ${A[@]}
spam egg

所以我怀疑这与使用$()有关。我该如何解决我的问题?

在赋值中使用括号,使其被视为一个数组,而不是一个个带空格的长字符串:

A=$(echo "spam egg")
echo ${A[0]}

-> spam egg

A=($(echo "spam egg"))
echo ${A[0]}

-> spam

(告诉 bash 到 运行 一个命令的 $() 的括号也不算告诉它把结果收集为一个数组。)