bash在循环中填充数组

时间:2012-04-02 23:12:25

标签: 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

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

2 个答案:

答案 0 :(得分:15)

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

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

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

?那是 - 你的while循环是管道的一部分吗?如果是这样,那么 就是问题了。您会看到,管道中的每个命令都会收到shell执行环境的副本。因此while循环将填充results数组的副本,当while循环完成时,该副本将消失。

已编辑添加:如果该 问题,那么在评论中指出glenn jackman时,您可以使用{{3}进行修复而不是:

while read data; do
    results[$data]=1
done < <(command_that_outputs_keys)

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

答案 1 :(得分:1)

这似乎工作正常:

$ cat mkt.sh 
declare -A results

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

while read data; do
  results[$data]=1
done << EOF
3
4
5
EOF

for i in "${!results[@]}"
do
  echo "key  : $i"
  echo "value: ${results[$i]}"
done

$ ./mkt.sh 
key  : a
value: 1
key  : b
value: 2
key  : 3
value: 1
key  : 4
value: 1
key  : 5
value: 1
$ 

Ubuntu 11.10,bash:GNU bash,版本4.2.10(1)-release(x86_64-pc-linux-gnu)。