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?

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

Radon Rosborough
quelle
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
Philip
quelle
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