Bash 4.3 e posterior suporta "referências de nomes", ou namerefs (existe um conceito semelhante em ksh93
, mas o escopo é irritantemente diferente ):
#!/bin/bash
array1=('array1string1' 'array1string2')
array2=('array2string1' 'array2string2')
array_names=('array1' 'array2')
for a in "${array_names[@]}"; do
declare -n arr="$a"
for b in "${arr[@]}"; do
echo "$b"
done
done
A variável arr
é um nameref que age como um alias para a variável nomeada (a variável com o nome $a
neste exemplo).
Sem namerefs, nas versões anteriores do Bash, uma solução seria criar um novo array que contenha todos os elementos dos outros arrays:
all=( "${array1[@]}" "${array2[@]}" )
... um pouco como a matriz array_names
na pergunta, mas com o conteúdo de todas as matrizes, e depois iterar sobre "${all[@]}"
.
Também é possível usar eval
, mas o código resultante parece incrivelmente terrível.
Veja a resposta de glenn jackman para uma variação com a indirecção variável (introduzida na sua forma atual com Bash versão 2) .