read print lista example array bash associative-array key-value bash4

print - Cómo iterar sobre matrices asociativas en Bash



bash read array (4)

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

Realmente no entiendo cómo obtener la clave mientras uso un bucle for-in.


Puede acceder a las teclas 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


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

Puede iterar sobre los pares clave / valor de esta manera:

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 declaración for (más el uso de @ lugar de * ). Esto es necesario en caso de que alguna tecla incluya espacios.

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


Utiliza 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


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 "/n Elements in arr are:/n ${arr[0]} /n ${arr[1]} /n ${arr[2]} /n ${arr[3]} /n ${arr[4]} /n ${arr[5]} /n ${arr[6]} /n ${arr[7]} /n ${arr[8]} /n ${arr[9]}" echo -e " /n Total elements in arr are : ${arr[*]} /n" echo -e " /n Total lenght of arr is : ${#arr[@]} /n" 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 ~