La página de manual de Bash describe el uso de ${!a}
para devolver el contenido de la variable cuyo nombre es el contenido de a
(un nivel de indirección).
Me gustaría saber cómo devolver todos los elementos en una matriz usando esto, es decir,
a=(one two three)
echo ${a[*]}
devoluciones
one two three
Me gustaria para:
b=a
echo ${!b[*]}
para devolver lo mismo. Desafortunadamente, no lo hace, pero regresa en su 0
lugar.
Actualizar
Dadas las respuestas, ahora me doy cuenta de que mi ejemplo era demasiado simple, ya que, por supuesto, algo así como:
b=("${a[@]}")
Logrará exactamente lo que dije que necesitaba.
Entonces, esto es lo que estaba tratando de hacer:
LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)
whichone=$1 # 'lys' or 'diaspar'
_LIST=LIST_$whichone
LIST=${!_LIST[*]}
Por supuesto, leer cuidadosamente la página de manual de Bash muestra que esto no funcionará como se esperaba porque la última línea simplemente devuelve los índices de la "matriz" $_LIST
(no una matriz en absoluto).
En cualquier caso, lo siguiente debería hacer el trabajo (como se señaló):
LIST=($(eval echo \${$_LIST[*]}))
o ... (la ruta que tomé, eventualmente):
LIST_lys="lys1 lys2"
...
LIST=(${!_LIST})
Suponiendo, por supuesto, que los elementos no contienen espacios en blanco.
[@]
al puntero_LIST="LIST_${whichone}[@]"
y luego, useLIST=("${!_LIST}")
para copiar la matriz. Es una buena idea usar nombres de variables en minúsculas para evitar conflictos con las variables de entorno (mayúsculas).