Quiero escribir un script para hacer referencia a múltiples matrices de otra matriz que contiene los nombres de las variables de estas.
Aquí está mi código hasta ahora:
#!/bin/bash
array1=('array1string1' 'array1string2')
array2=('array2string1' 'array2string2')
array_names=('array1' 'array2')
for a in ${array_names[@]}
do
for b in ${a[@]}
do
echo $b
done
done
Me gustaría que la salida escanee a través de ambas matrices (desde el bucle externo) e imprima las cadenas respectivas en el bucle interno que llama echo. Mi salida actual solo me muestra:
array1
array2
Le agradecería cualquier sugerencia con respecto a esto. ¡Gracias!
bash
shell-script
chnppp
fuente
fuente
for b in "${array1[@]}" "${array2[@]}"; do ...; done
?${a[@]}
a${!a}
hacer lo que quiere (creo).${!a[@]}
da una longitud de la matriza
.${!a}
es solo darme los primeros elementos.Respuestas:
Bash 4.3 y posterior admite "referencias de nombre" o namerefs (existe un concepto similar
ksh93
, pero el alcance es muy diferente ):La variable
arr
es un nameref que actúa como un alias para la variable nombrada (la variable con nombre$a
en este ejemplo).Sin namerefs, en versiones anteriores de Bash, una solución sería crear una nueva matriz que contenga todos los elementos de las otras matrices:
... un poco como la
array_names
matriz en la pregunta pero con el contenido de todas las matrices, y luego repetir"${all[@]}"
.También es posible usarlo
eval
, pero el código resultante se ve increíblemente horrible.Vea la respuesta de Glenn Jackman para una variación con indirección variable (introducida en su forma actual con Bash versión 2).
fuente
@Kusalananda tiene la mejor respuesta para versiones recientes de bash. Para versiones anteriores, puede usar una variable indirecta:
Vea el cuarto párrafo de https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion
fuente
Como una variación de lo que se ha dicho:
Accediendo a los elementos por índice
fuente