2012-04-02 115 views
5

如何在循环中填充数组?我想这样做:bash在循环中填充数组

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循环内添加任何内容到数组。为什么?

+1

你使用的是什么版本的bash? – siride 2012-04-02 23:18:06

回答

13

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

如果我可以大胆猜测。 。 。你运行这样的事情:

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

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

编辑补充:如果这个问题,那么作为glenn jackman指出了一个评论,您可以通过使用process substitution,而不是修复它:

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

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

+4

+1避免子shell的方法是使用进程替换:'while ... done <<(here here)< – 2012-04-02 23:44:35

+0

@glennjackman:辉煌,谢谢!我的第一个想法是“使用过程替换”,但我的第二个想法是“哦,等待,这将被替换为文件名,'while'不知道将该文件作为输入”。 '<(...)'现在我知道了,但我永远不会猜到这是被允许的。我已经更新了我的答案。再次感谢! :-D – ruakh 2012-04-02 23:51:54

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在这里,庆典:GNU的bash,版本4.2.10(1)-release下(x86_64-PC-Linux的GNU)。