Isso exigiu muitas tentativas e erros, mas acabou por funcionar.
Eu me inspirei em Youness. Mas todas as outras respostas não ajudaram no meu velho bash (suse11sp1 [3.2.51 (1) -release])
O loop 'for' recusou-se a expandir o array indireto, em vez disso você precisa pré-expandi-lo, use isso para criar outro array com o novo nome de variável. Meu exemplo abaixo mostra um loop duplo, já que é o meu uso pretendido.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
TheNewVariable=$(eval echo \${${j#New_}things[@]})
for i in $TheNewVariable
do
echo $j $i" hello"
echo
done
done
Estou usando # para excluir o "New_" da primeira entrada da matriz e concatenar com "things" para obter "FOOthings".
\ $ {} com echo e eval, em seguida, faça suas tarefas na ordem sem gerar erros, que são agrupados em um novo $ () e atribuídos ao novo nome da variável.
$ Test.sh
New_FOO 1 hello
New_FOO 2 hello
New_FOO 3 hello
New_BAR a hello
New_BAR b hello
New_BAR c hello
ATUALIZAÇÃO ##### 2018/06/07
Recentemente, descobri mais uma rodada sobre esse problema. A variável criada não é, na verdade, uma matriz, mas uma string delimitada por espaço.
Para a tarefa acima, isso foi ok, por causa de como "for" funciona, ele não lê a matriz, é expandido e, em seguida, executado em loop, veja extrair abaixo:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
Mas eu precisei usá-lo como um array. Para isso eu precisava realizar mais um passo. Tomei o código literalmente por Dennis Williamson . Eu testei e funciona bem.
IFS=', ' read -r -a TheNewVariable <<< ${TheNewVariable[@]}
O "IFS = ','" é uma variável que contém o seu deliminador. "read" com "-a" corta e alimenta a picada de volta na variável array. Observe que isso não respeita as aspas, mas há algumas opções em como para gerenciar isso, por exemplo Eu removi o sinalizador -r que eu não precisava.
Então agora eu combinei essa adição na criação da variável, que permite que os dados sejam tratados e endereçados como deveriam.
THEBIGLOOP=(New_FOO New_BAR)
FOOthings=(1 2 3)
BARthings=(a b c)
for j in ${THEBIGLOOP[*]}
do
IFS=', ' read -a TheNewVariable <<< $(eval echo \${${j#New_}things[@]})
for i in ${TheNewVariable[@]} #Now have to wrap with {} and expand with @
do
echo $j $i" hello"
echo ${TheNewVariable[$i]} #This would not work in the original code
echo
done
done