Durchlaufen von Schlüsseln (oder k / v-Paaren) in einem zsh-assoziativen Array?


23

In zsh möchte ich ein assoziatives Array durchlaufen. Ich brauche sowohl Schlüssel als auch Werte. Wenn ich aber normal ( for x in $assoc_array) über das assoziative Array iteriere , erhalte ich nur Werte.

Alle Beispiele, die ich mir angesehen habe, zeigen, dass Sie bei einem gegebenen Schlüssel seinen Wert aus einem assoziativen Array erhalten können. Mein Problem ist, dass ich zuerst den Schlüsselsatz bekomme.

Unterstützt zsh das Iterieren über Schlüssel in einem assoziativen Array?


Wenn Sie nur eine kleine Liste haben, könnte dies eine Option sein:for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
Mathe

Antworten:


12

Mit dieser raffinierten Parametererweiterung können Sie sowohl Schlüssel als auch Werte gleichzeitig abrufen:

for key val in ${(kv)assoc_array}; do
    echo "$key -> $val"
done

Siehe Parametererweiterungsflags im Zsh-Handbuch.


Das ist viel einfacher +1
TimSum

Dies funktioniert nicht, wenn die Schlüssel oder Werte Leerzeichen enthalten
Max Coplan

30

Nachdem ich meine Frage gestellt hatte, suchte ich weiter und fand diese Antwort in Unix StackExchange:

typeset -A assoc_array
assoc_array=(k1 v1 k2 v2 k3 v3)

for k in "${(@k)assoc_array}"; do
  echo "$k -> $assoc_array[$k]"
done

Ausgabe ist:

k1 -> v1
k2 -> v2
k3 -> v3

1
Wenn Sie dies auf nützliche Weise testen möchten, versuchen Sie es mit dem eingebauten $options. (Siehe man zshoptions)
mVChr

Was ist, wenn der Schlüssel keine ansteigende Zahl wie foo, bar usw. wie arr [foo] = baz ist?
Timo
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.