Хотя ассоциативные массивы bash
были вдохновлены ассоциативными массивами ksh93
(со всеми их недостатками), они не поддерживают присваивание своим значениям ничего, кроме скаляров.
Для ассоциативного массива, чьи значения могут быть массивами, вам нужно ksh93
:
$ ksh -c 'typeset -A logs; for f in *.log*; do logs[${f%.log*}]+=($f); done; typeset -p logs'
typeset -A logs=([example1]=(example1.log example1.log.1) [log2]=(log2.log) [xpto]=(xpto.log xpto.log.1 xpto.log.2) )
Перебирать их:
typeset -A logs
for f in *.log*; do logs[${f%.log*}]+=($f); done
for key in "${!logs[@]}"; do
printf '%s:\n' "$key"
for file in "${logs[$key][@]}"; do
printf ' File: "%s"\n' "$file"
done
done
zsh
Ассоциативные массивы также могут иметь только скалярные значения, но поскольку эти значения могут содержать символ NUL, они могут хранить списки произвольных имен файлов (разделив их символами NUL). В bash
, поскольку все имена файлов находятся в текущем каталоге, вы можете разделить их символами /
. Или если вы можете сделать некоторое предположение, что определенный символ не встречается в именах файлов (например, подход @xhienne с символом пробела), вы можете использовать его вместо этого. Также обратите внимание, что bash
ассоциативные массивы имеют ограничение на то, что ключ не может быть пустым.