Я видел трюк для реализации ассоциативных массивов в сценарии оболочки. Например, print array["apples"]
может быть написано, echo \$array$key
где ключ = яблоки.
Однако не было упоминания о том, как генерировать ключи для перебора массива. Единственный способ, которым я мог придумать, - хранить ключи в переменной, разделенной пробелами, чтобы я мог использовать цикл for для итерации по массиву.
Итак, есть ли другой способ хранения ключей для последующего использования?
Ответы:
Оболочки с ассоциативными массивами
Некоторые современные оболочки предоставляют ассоциативные массивы: ksh93, bash ≥4, zsh. В ksh93 и bash, если
a
это ассоциативный массив, то"${!a[@]}"
это массив его ключей:В zsh этот синтаксис работает только в режиме эмуляции ksh. В противном случае вы должны использовать собственный синтаксис zsh:
${(k)a}
также работает, еслиa
нет пустого ключа.В zsh вы также можете одновременно
k
выполнятьv
циклы для eys и alues:Оболочки без ассоциативных массивов
Эмуляция ассоциативных массивов в оболочках, в которых их нет, - это гораздо больше работы. Если вам нужны ассоциативные массивы, возможно, пришло время добавить более крупный инструмент, такой как ksh93 или Perl.
Если вам нужны ассоциативные массивы в простой оболочке POSIX, вот способ имитировать их, когда ключи ограничены только символами
0-9A-Z_a-z
(цифры ASCII, буквы и подчеркивание). При этом предположении ключи могут использоваться как часть имен переменных. Приведенные ниже функции воздействуют на массив, идентифицируемый префиксом именования «основа», который не должен содержать двух последовательных подчеркиваний.(Предупреждение, непроверенный код. Обнаружение ошибок для синтаксически неверных основ и ключей не предусмотрено.)
источник
Я не уверен, что вы подразумеваете под магазином, но вы можете перебирать ключи, используя
${!array[@]}
синтаксис:Итак, для повторения:
Я нашел хороший, короткий урок по этому вопросу здесь .
Как указано в комментариях ниже, ассоциативные массивы были добавлены в
bash
версии 4. См здесь для журнальной статьи Linux на эту тему.источник
(bash version 4 only)
Это важно отметить. Традиционноbash
массивы являются только числовыми.typeset
вместоdeclare
своих примеров. Это сделало бы их переносимыми между bash 4 и ksh93, которые сначала реализовали ассоциативные массивы оболочки.Оболочки без ассоциативных массивов
Это не так сложно, когда ключи ограничены
[0-9A-Za-z_]
(цифры, буквы, подчеркивание).Хитрость заключается не в сохранении в массиве [ $ key ], а в хранении в переменных array_ $ key .
Установлен:
Получить:
Примечание: значения не могут содержать
'
(одинарные кавычки).источник
это работает в Bash
ИЛИ
Не нужно использовать eval afaik
источник