如何在Bash中迭代关联数组

How to iterate over associative arrays in Bash

基于bash脚本中的关联数组,我需要对其进行迭代以获取键和值。

1
2
3
4
5
#!/bin/bash

declare -A array
array[foo]=bar
array[bar]=foo

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


使用感叹号访问键:${!array[@]},使用${array[@]}访问值。

您可以这样迭代键/值对:

1
2
3
4
5
for i in"${!array[@]}"
do
  echo"key  : $i"
  echo"value: ${array[$i]}"
done

注意在for语句中变量周围使用引号(加上使用@而不是*)。这是必要的,以防任何键包括空格。

另一个答案中的混淆来自这样一个事实:您的问题包括键和值的"foo"和"bar"。


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

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

然后,迭代键/值对很容易:

1
2
3
4
5
for i in"${!array[@]}"
do
  echo"key :" $i
  echo"value:" ${array[$i]}
done


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

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

例子:

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
declare -a arr
echo"-------------------------------------"
echo"Here another example with arr numeric"
echo"-------------------------------------"
arr=( 10 200 3000 40000 500000 60 700 8000 90000 100000 )

echo -e"
 Elements in arr are:
 ${arr[0]}
 ${arr[1]}
 ${arr[2]}
 ${arr[3]}
 ${arr[4]}
 ${arr[5]}
 ${arr[6]}
 ${arr[7]}
 ${arr[8]}
 ${arr[9]}"


echo -e"
 Total elements in arr are : ${arr[*]}
"


echo -e"
 Total lenght of arr is : ${#arr[@]}
"


for (( i=0; i<10; i++ ))
do      echo"The value in position $i for arr is [ ${arr[i]} ]"
done

for (( j=0; j<10; j++ ))
do      echo"The length in element $j is ${#arr[j]}"
done

for z in"${!arr[@]}"
do      echo"The key ID is $z"
done
~