2013-05-22 144 views
2

這應該打印整個關聯數組到控制檯: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

回答

6

在Bash 4和更新版本中支持關聯數組。使用-a選項聲明的數組只是一個常規數組,可以使用整數索引,而不是鍵。這個聲明導致數組有一個元素value2。使用for key in ${!array[@]}迭代密鑰時,$key的值爲0,因此您將獲得第一個元素。

鑑於在嘗試使用-A聲明數組時遇到錯誤輸出,我假定您的Bash版本大於4.檢查變量$BASH_VERSION

有關陣列的更深入的說明,請參閱http://mywiki.wooledge.org/BashGuide/Arrays

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

給我一個錯誤'./test.sh:line 3:declare:-A:invalid option declare:usage:declare [-afFirtx] [-p] [name [= value] ...]' – mles

+1

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

相關問題