在bash中通过关联数组的foreach循环只返回最后一个元素

时间:2013-05-22 09:45:31

标签: arrays bash shell

这应该将整个关联数组打印到控制台:

#!/bin/sh

declare -a array=([key1]='value1' [key2]='value2')

for key in ${!array[@]}; do
    echo "Key = $key"
    echo "Value = ${array[$key]}"
done

echo ${array[key1]}
echo ${array[key2]}

相反,它会打印最后一个变量:

[mles@sagnix etl-i_test]$ ./test.sh 
Key = 0
Value = value2
value2
value2

我的错在哪里?

@htor : Bash版本是3.2.25(1) - 发布。

2 个答案:

答案 0 :(得分:6)

Bash 4及更新版本支持关联数组。使用-a选项声明的数组只是一个常规数组,可以用整数而不是键来索引。此声明导致数组中包含一个元素value2。当使用for key in ${!array[@]}迭代密钥时,$key的值为0,因此您获得第一个元素。

考虑到在尝试使用-A声明数组时得到的错误输出,我假设您的Bash版本早于4.检查变量$BASH_VERSION

有关数组的更深入解释,请参阅http://mywiki.wooledge.org/BashGuide/Arrays

答案 1 :(得分:3)

#!/bin/bash

declare -A array=([key1]='value1' [key2]='value2')

for key in ${!array[@]}; do
    echo "array[$key] = ${array[$key]}"
done

echo ${array[key1]}
echo ${array[key2]}