it-swarm.com.de

Wie man assoziative Arrays in Bash durchläuft

Basierend auf einem assoziativen Array in einem Bash-Skript muss ich iterieren, um den Schlüssel und den Wert zu ermitteln.

#!/bin/bash

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

Ich verstehe eigentlich nicht, wie man den Schlüssel erhält, während ich eine For-In-Schleife benutzt.

277
pex

Der Zugriff auf die Schlüssel erfolgt über ein Ausrufezeichen: ${!array[@]}, auf dievalues ​​wird mit ${array[@]} zugegriffen.

Sie können die Schlüssel/Wert-Paare folgendermaßen durchlaufen:

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

Beachten Sie die Verwendung von Anführungszeichen um die Variable in der for-Anweisung (plus die Verwendung von @ anstelle von *). Dies ist erforderlich, wenn Schlüssel Leerzeichen enthalten.

Die Verwirrung in der anderen Antwort ergibt sich aus der Tatsache, dass Ihre Frage "foo" und "bar" für die Schlüssel und der Werte enthält.

495

Sie können auf die Schlüssel mit ${!array[@]} zugreifen:

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

Dann ist das Durchlaufen der Schlüssel/Wert-Paare einfach:

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

Verwenden Sie diese Funktion höherer Ordnung, um die Pyramide von Doom zu verhindern.

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

beispiel: 

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