为什么 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 到 运行 一个命令的 $()
的括号也不算告诉它把结果收集为一个数组。)
我将我的用例剥离到这 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 到 运行 一个命令的 $()
的括号也不算告诉它把结果收集为一个数组。)