【问题标题】:Why doesn't Bash overwrite my array with a new one?为什么 Bash 不使用新数组覆盖我的数组?
【发布时间】:2017-03-24 19:47:04
【问题描述】:

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

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

它创建一个包含两个手写元素的数组。然后一段时间后,我想用命令行工具的输出替换我的数组(例如ls *.vhd)。 Bash 不会替换数组,而是仅替换第一个元素,因此 bar 在末尾被“附加”。

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

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

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

【问题讨论】:

  • A=$(echo "spam egg") 等价于A[0]=$(echo "spam egg")

标签: arrays bash overwrite


【解决方案1】:

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

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

->spam egg

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

->spam

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

【讨论】:

  • 索引不适用于常规字符串。在您的第一个示例中,${A[1]} 不会是 s
  • 啊,对不起!我在zsh 中编写了示例,尽管需要括号的要点仍然存在。更改为:A=($(echo "spam egg")); echo ${A[0]} -> spambash
  • 很高兴更新您的答案以显示相关的bash 代码。
  • 谢谢。我花了半天时间调试这个......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-29
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
相关资源
最近更新 更多