bash在循环中填充数组

Dej*_*jwi 6 bash for-loop associative-array

如何在循环中填充数组?我想做那样的事情:

declare -A results

results["a"]=1
results["b"]=2

while read data; do
results[$data]=1
done

for i in "${!results[@]}"
do
  echo "key  : $i"
  echo "value: ${results[$i]}"
done
Run Code Online (Sandbox Code Playgroud)

但似乎我无法在for循环中向数组添加任何内容.为什么?

rua*_*akh 16

你有什么应该工作,假设你有一个支持关联数组的Bash版本.

如果我可以猜测一下...你在运行这样的东西:

command_that_outputs_keys \
  | while read data; do
        results[$data]=1
    done
Run Code Online (Sandbox Code Playgroud)

?那是 - 你的while循环是管道的一部分吗?如果是这样,那就是问题所在.您可以看到,管道中的每个命令都会收到shell执行环境的副本.因此,while循环将被填充一个副本中的results阵列,而当while循环完成,该副本消失.

编辑添加:如果这问题,那么正如glenn jackman在评论中指出的那样,你可以通过使用进程替换来修复它:

while read data; do
    results[$data]=1
done < <(command_that_outputs_keys)
Run Code Online (Sandbox Code Playgroud)

这样,虽然command_that_outputs_keys只接收shell的执行环境(如前所述),但while循环将具有原始的主环境,因此可以修改原始数组.

  • +1避免子shell的方法是使用进程替换:`while ... done <<(这里命令)` (6认同)