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...

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


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_
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.