web-dev-qa-db-fra.com

Comment itérer sur des tableaux associatifs dans Bash

Basé sur un tableau associatif dans un script Bash, je dois effectuer une itération dessus pour obtenir la clé et la valeur.

#!/bin/bash

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

En fait, je ne comprends pas comment obtenir la clé en utilisant une boucle entrante.

277
pex

L'accès aux clés s'effectue à l'aide d'un point d'exclamation: ${!array[@]}, lesvalues ​​sont accessibles via ${array[@]}.

Vous pouvez parcourir les paires clé/valeur comme suit:

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

Notez l'utilisation de guillemets autour de la variable dans l'instruction for (plus l'utilisation de @ au lieu de *). Ceci est nécessaire au cas où des clés incluent des espaces.

La confusion dans l'autre réponse provient du fait que votre question inclut "foo" et "bar" pour les clés et les valeurs.

495
Dennis Williamson

Vous pouvez accéder aux clés avec ${!array[@]}:

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

Ensuite, il est facile de parcourir les paires clé/valeur:

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

Utilisez cette fonction d'ordre supérieur pour empêcher la pyramide de Doom

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

exemple: 

$ bar(){ echo "$1 -> $2"; }
$ declare -A foo["flap"]="three four" foo["flop"]="one two"
$ foreach foo bar
flap -> three four
flop -> one two
7
coderofsalvation
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
~
0
EJISRHA