Ciò ha richiesto molti tentativi ed errori ma alla fine ha funzionato.
Ho preso ispirazione da Youness. Ma tutte le altre risposte non mi sono state d'aiuto nel mio vecchio bash (suse11sp1 [3.2.51 (1) -release])
Il ciclo 'for' ha rifiutato di espandere l'array indiretto, invece devi pre-espanderlo, usalo per creare un altro array con il tuo nuovo nome di variabile. Il mio esempio di seguito mostra un doppio ciclo, poiché quello è il mio uso previsto.
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
Sto usando # per eliminare "New_" dalla prima voce dell'array, quindi concatenandomi con "cose", per ottenere "FOOthings". \ $ {} con echo ed eval, quindi eseguono le loro operazioni in ordine senza generare errori, che viene racchiuso in un nuovo $ () e assegnato il nuovo nome di variabile.
$ 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
AGGIORNAMENTO ##### 2018/06/07
Di recente ho scoperto un altro giro su questo problema. La variabile creata non è in realtà un array, ma una stringa delimitata da spazi. Per il compito sopra questo era ok, a causa del modo in cui "for" funziona, non legge l'array, viene espanso e quindi ripetuto, vedi estratto sotto:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
Ma poi avevo bisogno di usarlo come un array. Per questo avevo bisogno di eseguire un altro passo. Ho preso il codice alla lettera da Dennis Williamson . L'ho provato e funziona benissimo.
IFS=', ' read -r -a TheNewVariable <<< ${TheNewVariable[@]}
"IFS = ','" è una variabile che contiene il delimitatore. "read" con "-a" taglia e reinserisce la puntura nella variabile array. Nota, questo non ha rispetto per le virgolette, ma ci sono alcune opzioni in lettura per gestirlo, ad esempio ho rimosso il flag -r di cui non avevo bisogno. Quindi ho combinato questa aggiunta nella creazione della variabile, che consente di trattare e indirizzare i dati come dovrebbero.
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