foreach循环只返回最后一个元素

问题描述:

这应该打印整个关联数组到控制台:foreach循环只返回最后一个元素

#!/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]} 

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

[[email protected] etl-i_test]$ ./test.sh 
Key = 0 
Value = value2 
value2 
value2 

哪里是我的故障?

@htor: Bash版本是3.2.25(1) - 释放。

+0

看看http://stackoverflow.com/q/688849/1983854,有很多解决方案。 – fedorqui

+2

你确定/ bin/sh实际上是/ bin/bash吗?还有关联数组是使用'-A'而不是'-a'构建的......看到下面的回答 –

+0

/bin/sh是我系统上bash的符号链接 – mles

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

鉴于在尝试使用-A声明数组时遇到错误输出,我假定您的Bash版本大于4.检查变量$BASH_VERSION

有关阵列的更深入的说明,请参阅http://mywiki.wooledge.org/BashGuide/Arrays

#!/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]} 
+0

给我一个错误'./test.sh:line 3:declare:-A:invalid option declare:usage:declare [-afFirtx] [-p] [name [= value] ...]' – mles

+1

@ mles:你没有使用'bash'4或更高版本。 – chepner