如何在循环中填充数组?我想做那样的事情:
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循环中向数组添加任何内容。为什么呢?
答案 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)。