Cómo iterar sobre matrices asociativas en Bash

Basado en una matriz asociativa en un script Bash, necesito iterar sobre él para obtener la clave y el valor.

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

De hecho, no entiendo cómo obtener la clave mientras uso un ciclo for-in.

Se accede a las teclas usando un signo de exclamación: ${!array[@]} , se accede a los valores usando ${array[@]} .

Puede iterar sobre los pares de clave / valor como este:

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

Tenga en cuenta el uso de comillas alrededor de la variable en la instrucción for (más el uso de @ lugar de * ). Esto es necesario en caso de que cualquier tecla incluya espacios.

La confusión en la otra respuesta proviene del hecho de que su pregunta incluye “foo” y “bar” tanto para las claves como para los valores.

Puede acceder a las claves con ${!array[@]} :

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

Entonces, iterar sobre los pares clave / valor es fácil:

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

Utilice esta función de orden superior para evitar la pirámide de la fatalidad

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

ejemplo:

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