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
~