Foram necessárias muitas tentativas e erros, mas eventualmente funcionaram.
Tomei alguma inspiração de Youness. Mas todas as outras respostas não ajudaram na minha antiga festança (suse11sp1 [lançamento do 3.2.51 (1)])
O loop 'for' recusou-se a expandir a matriz indireta; em vez disso, você precisa pré-expandi-la. Use isso para criar outra matriz com seu novo nome de variável. Meu exemplo abaixo mostra um loop duplo, pois esse é 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, faça suas tarefas em 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
Eu descobri recentemente mais uma rodada sobre esse problema. A variável criada não é realmente uma matriz, mas uma sequência delimitada por espaço. Para a tarefa acima, isso foi bom, por causa de como "for" funciona, ele não lê a matriz, é expandido e depois percorre o loop, veja o extrato abaixo:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
Mas, então eu precisava usá-lo como uma matriz. Para isso, eu precisava executar mais uma etapa. Eu peguei 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 seu deliminador. "read" com "-a" corta e alimenta a picada de volta na variável da matriz. Observe que isso não respeita as aspas, mas existem algumas opções na leitura para gerenciar isso; por exemplo, removi o sinalizador -r do qual não precisava. Portanto, agora combinei essa adição na criação de variáveis, 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