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循环将具有原始的主环境,因此可以修改原始数组.