Gibt es eine Möglichkeit, alle 'Index-IDs' (Schlüssel) in einer assoziativen Bash-Array-Variablen aufzulisten?

26

Ich habe dieses Array:

declare -A astr

Ich füge Elemente hinzu:

astr[elemA]=123
astr[elemB]=199

Aber später muss ich wissen, was die Index-IDs (elemA und elemB) sind und sie auflisten.

echo "${astr[@]}" #this only get me the values...
Wassermann Power
quelle

Antworten:

35

Sie können die Liste der "Schlüssel" für das assoziative Array folgendermaßen abrufen:

$ echo "${!astr[@]}"
elemB elemA

Sie können die "Schlüssel" folgendermaßen durchlaufen:

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

Beispiel

$ for i in "${!astr[@]}"; do echo "key  : $i"; echo "value: ${astr[$i]}"; done
key  : elemB
value: 199
key  : elemA
value: 123

Verweise

slm
quelle
1
Ich habe gerade festgestellt, dass es auch für numerisch indizierte Arrays astr2=(a b c d e);echo ${!astr2[@]};unset astr2[2];echo ${!astr2[@]}funktioniert : thx!
Aquarius Power
@AquariusPower - Ja, wenn Sie die Änderungen an meiner Antwort rückgängig machen, werden Sie sehen, dass ich ursprünglich auch den numerischen Index aufgenommen habe, ihn dann aber gelöscht habe, da Sie benannte Hashes wollten.
SLM
Beachten Sie, dass ${!var[index]}dies nicht funktioniert, nur ${!var[@]}oder ${!var[*]}:(
i336_
@ i336_ - nimm das !raus, so ist es ${var[index]}. tldp.org/LDP/abs/html/arrays.html
slm
Entschuldigung, Klarstellung: Ich habe versucht, den Assoziativschlüssel für den numerischen Index n zu ermitteln . Ich erkannte, dass ich es einfach tun kann keys=(${!var[@]})und ${keys[n]}gab mir den Index, aber ungefähr zur gleichen Zeit wurde mir auch klar, dass ich meinen Ansatz überdenken muss.
i336_