如何迭代Bash中的关联数组

基于Bash脚本中的关联数组,我需要遍历它以获取键和值。

#!/bin/bash declare -A array array[foo]=bar array[bar]=foo 

我实际上不明白如何在使用for-in循环时获得密钥。

使用感叹号访问键: ${!array[@]} ,这些可以使用${array[@]}进行访问。

你可以像这样迭代键/值对:

 for i in "${!array[@]}" do echo "key : $i" echo "value: ${array[$i]}" done 

注意for语句中variables的引号使用(加上使用@而不是* )。 这是必要的,如果任何键包括空格。

在另一个答案混淆来自事实,你的问题包括键值的“富”和“酒吧”。

您可以使用${!array[@]}访问密钥:

 bash-4.0$ echo "${!array[@]}" foo bar 

然后,遍历键/值对是很容易的:

 for i in "${!array[@]}" do echo "key :" $i echo "value:" ${array[$i]} done 

使用这个更高阶的函数来防止厄运的金字塔

 foreach(){ arr="$(declare -p $1)" ; eval "declare -A f="${arr#*=}; for i in ${!f[@]}; do $2 "$i" "${f[$i]}"; done } 

例:

 $ bar(){ echo "$1 -> $2"; } $ declare -A foo["flap"]="three four" foo["flop"]="one two" $ foreach foo bar flap -> three four flop -> one two