Перебор ключей (или пар 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?
Тимо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.