Embora as matrizes associativas bash
tenham sido inspiradas a partir de ksh93
(com todas as suas verrugas), ela não suporta a atribuição de nada além de escalares para seus valores.
Para um array associativo cujos valores podem ser arrays, você precisa de 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) )
Para passar por cima deles:
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
Matrizes associativas de
zsh
também podem ter valores escalares, mas como esses valores podem conter o caractere NUL, eles podem armazenar listas de nomes de arquivos arbitrários (delimitando-os com caracteres NUL). Com bash
, aqui, como os nomes dos arquivos estão todos no diretório atual, você pode delimitar com /
. Ou se você puder supor que um caractere específico não ocorre nos nomes dos arquivos (como a abordagem do @xhienne com o caractere de espaço), você pode usá-lo. Observe também que as matrizes associativas bash
têm essa limitação de que a chave não pode estar vazia.