如何在Bash中迭代关联数组

pex*_*pex 319 bash associative-array key-value bash4

基于Bash脚本中的关联数组,我需要迭代它以获取键和值.

#!/bin/bash

declare -A array
array[foo]=bar
array[bar]=foo
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*ce. 545

使用感叹号访问密钥:${!array[@]},使用感知访问${array[@]}.

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

for i in "${!array[@]}"
do
  echo "key  : $i"
  echo "value: ${array[$i]}"
done
Run Code Online (Sandbox Code Playgroud)

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

另一个答案的混淆来自于你的问题包括键值的"foo"和"bar" .

  • @ Michael-O:你需要引用参数扩展来保护可能有空格的键:`array =("$ {!hash [@]}")` (10认同)
  • 现在,如果将所有键分配给数组:`array =($ {!hash [@]})` (3认同)
  • 在Zsh中,这是通过`$ {(k)arr [@]}`完成的 (3认同)
  • @pkaramol:从 Bash 4.3 开始,您可以使用 namerefs。示例:`declare -A aa; aa['A']=a1; aa['B']=b2; aa['C']=c3; foo () { 声明 -n assoc=$1; 输入“${!assoc[@]}”;do echo "Key: $key; Value: ${assoc[$key]}"; 完毕; }; foo aa`。请参阅 [BashFAQ/006](https://mywiki.wooledge.org/BashFAQ/006) 了解一些重要信息。 (2认同)

ton*_*nio 41

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

bash-4.0$ echo "${!array[@]}"
foo bar
Run Code Online (Sandbox Code Playgroud)

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

for i in "${!array[@]}"
do
  echo "key :" $i
  echo "value:" ${array[$i]}
done
Run Code Online (Sandbox Code Playgroud)


cod*_*ion 7

使用此更高阶函数来防止厄运金字塔

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

例:

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


mOm*_*ney 7

欢迎使用输入关联数组2.0!

    clear
    echo "Welcome to input associative array 2.0! (Spaces in keys and values now supported)"
    unset array
    declare -A array
    read -p 'Enter number for array size: ' num
    for (( i=0; i < num; i++ ))
        do
            echo -n "(pair $(( $i+1 )))"
            read -p ' Enter key: ' k
            read -p '         Enter value: ' v
            echo " "
            array[$k]=$v
        done
    echo " "
    echo "The keys are: " ${!array[@]}
    echo "The values are: " ${array[@]}
    echo " "
    echo "Key <-> Value"
    echo "-------------"
    for i in "${!array[@]}"; do echo $i "<->" ${array[$i]}; done
    echo " "
    echo "Thanks for using input associative array 2.0!"
Run Code Online (Sandbox Code Playgroud)

输出:

Welcome to input associative array 2.0! (Spaces in keys and values now supported)
Enter number for array size: 4
(pair 1) Enter key: Key Number 1
         Enter value: Value#1

(pair 2) Enter key: Key Two
         Enter value: Value2

(pair 3) Enter key: Key3
         Enter value: Val3

(pair 4) Enter key: Key4
         Enter value: Value4


The keys are:  Key4 Key3 Key Number 1 Key Two
The values are:  Value4 Val3 Value#1 Value2

Key <-> Value
-------------
Key4 <-> Value4
Key3 <-> Val3
Key Number 1 <-> Value#1
Key Two <-> Value2

Thanks for using input associative array 2.0!
Run Code Online (Sandbox Code Playgroud)

输入关联数组 1.0

(不支持包含空格的键和值)

    clear
    echo "Welcome to input associative array! (written by mO extraordinaire!)"
    unset array
    declare -A array
    read -p 'Enter number for array size: ' num
    for (( i=0; i < num; i++ ))
        do
            read -p 'Enter key and value separated by a space: ' k v
            array[$k]=$v
        done
    echo " "
    echo "The keys are: " ${!array[@]}
    echo "The values are: " ${array[@]}
    echo " "
    echo "Key <-> Value"
    echo "-------------"
    for i in ${!array[@]}; do echo $i "<->" ${array[$i]}; done
    echo " "
    echo "Thanks for using input associative array!"
Run Code Online (Sandbox Code Playgroud)

输出:

Welcome to input associative array! (written by mO extraordinaire!)
Enter number for array size: 10
Enter key and value separated by a space: a1 10
Enter key and value separated by a space: b2 20
Enter key and value separated by a space: c3 30
Enter key and value separated by a space: d4 40
Enter key and value separated by a space: e5 50
Enter key and value separated by a space: f6 60
Enter key and value separated by a space: g7 70
Enter key and value separated by a space: h8 80
Enter key and value separated by a space: i9 90
Enter key and value separated by a space: j10 100

The keys are:  h8 a1 j10 g7 f6 e5 d4 c3 i9 b2
The values are:  80 10 100 70 60 50 40 30 90 20

Key <-> Value
-------------
h8 <-> 80
a1 <-> 10
j10 <-> 100
g7 <-> 70
f6 <-> 60
e5 <-> 50
d4 <-> 40
c3 <-> 30
i9 <-> 90
b2 <-> 20

Thanks for using input associative array!
Run Code Online (Sandbox Code Playgroud)