Esto requirió mucha prueba y error, pero finalmente funcionó.
Tomé un poco de inspiración de Youness. Pero todas las otras respuestas no ayudaron en mi viejo bash (suse11sp1 [3.2.51 (1) -release])
El bucle 'for' se negó a expandir la matriz indirecta, en su lugar, debe expandirla previamente, usarla para crear otra matriz con su nuevo nombre de variable. Mi ejemplo a continuación muestra un doble bucle, ya que ese es mi 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
Estoy usando # para eliminar el "Nuevo_" de la primera entrada de la matriz, luego concatenando con "cosas", para obtener "FOOthings". \ $ {} con echo y eval, luego haga lo suyo en orden sin arrojar errores, que se envuelve en un nuevo $ () y se le asigna el nuevo nombre de la variable.
$ 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
ACTUALIZACIÓN ##### 2018/06/07
Recientemente descubrí un giro más sobre este tema. La variable creada no es en realidad una matriz, sino una cadena delimitada por espacios. Para la tarea anterior, esto estaba bien, debido a cómo funciona "for", no lee la matriz, se expande y luego se repite, vea el extracto a continuación:
for VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
Pero, luego necesitaba usarlo como una matriz. Para esto necesitaba realizar un paso más. Tomé el código literalmente por Dennis Williamson . Lo he probado y funciona bien.
IFS=', ' read -r -a TheNewVariable <<< ${TheNewVariable[@]}
El "IFS = ','" es una variable que contiene su deliminador. "leer" con "-a" corta y retroalimenta la picadura en la variable de matriz. Tenga en cuenta que esto no respeta las comillas, pero hay algunas opciones en lectura para administrar esto, por ejemplo, he eliminado el indicador -r que no necesitaba. Así que ahora he combinado esta adición en la creación de variables, lo que permite que los datos sean tratados y tratados como deberían.
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