Перебор ключей (или пар k / v) в ассоциативном массиве zsh?

23

В zsh я хочу перебрать ассоциативный массив. Мне нужны и ключи, и значения. Но когда я перебираю ассоциативный массив обычно ( for x in $assoc_array), я получаю только значения.

Все примеры, которые я посмотрел, показывают, что, учитывая ключ , вы можете получить его значение из ассоциативного массива. Моя проблема заключается в получении набора ключей для начала.

Поддерживает ли zsh перебор ключей в ассоциативном массиве?

Филипп
источник
Если у вас есть только небольшой список, это может быть вариант:for i in a,b c_s,d ; do KEY=${i%,*}; VAL=${i#*,}; echo $KEY" XX "$VAL; done
математика

Ответы:

12

Вы можете получить как ключи, так и значения одновременно с этим изящным расширением параметра:

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

См. Флаги расширения параметров в руководстве по Zsh.

Радон Росборо
источник
Это намного проще +1
TimSum
Это не работает, когда ключи или значения содержат пробелы
Макс Коплан
30

Я продолжил поиск, задав свой вопрос, и нашел этот ответ в 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

Выход:

k1 -> v1
k2 -> v2
k3 -> v3
Филипп
источник
1
Для тех, кто хочет проверить это полезным способом, попробуйте встроенный $options. (Смотрите man zshoptions)
mVChr
Что если ключ не является возрастающим числом, таким как foo, bar и т. Д., Например, arr [foo] = baz?
Тимо