Iterowanie nad kluczami (lub parami k / v) w tablicy asocjacyjnej zsh?

21

W zsh chcę iterować po tablicy asocjacyjnej. Potrzebuję zarówno kluczy, jak i wartości. Ale kiedy normalnie wykonuję iterację tablicy asocjacyjnej ( for x in $assoc_array ), Dostaję tylko wartości.

Wszystkie przykłady, które obejrzałem pokazują, że podany klucz , możesz uzyskać jego wartość z tablicy asocjacyjnej. Moim problemem jest uzyskanie zestawu kluczy na początek.

Czy zsh obsługuje iterację nad kluczami w tablicy asocjacyjnej?

Philip
źródło
Jeśli masz tylko małą listę, może to być opcja: for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
math

Odpowiedzi:

7

Możesz uzyskać oba klucze i wartości naraz, dzięki temu sprytnemu rozszerzeniu parametrów:

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

Widzieć Flagi rozszerzające parametry w instrukcji Zsh.

Radon Rosborough
źródło
To jest prostsze +1
TimSum
27

Kontynuowałem poszukiwania po zadaniu pytania i znalazłem ta odpowiedź na 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

Wyjście to:

k1 -> v1
k2 -> v2
k3 -> v3
Philip
źródło
1
Dla każdego, kto chce przetestować to w użyteczny sposób, spróbuj użyć wbudowanego $options. (Widzieć man zshoptions )
mVChr
Co jeśli klucz nie jest rosnącą liczbą, taką jak foo, bar, etc jak arr [foo] = baz?
Timo