La pagina man di Bash descrive l'uso di ${!a}
per restituire il contenuto della variabile il cui nome è il contenuto di a
(un livello di riferimento indiretto).
Mi piacerebbe sapere come restituire tutti gli elementi in un array usando questo, cioè
a=(one two three)
echo ${a[*]}
ritorna
one two three
Vorrei per:
b=a
echo ${!b[*]}
per restituire lo stesso. Sfortunatamente, non lo fa, ma ritorna 0
invece.
Aggiornare
Date le risposte, ora mi rendo conto che il mio esempio era troppo semplice, dato che ovviamente qualcosa del tipo:
b=("${a[@]}")
Raggiungerà esattamente quello che ho detto di cui avevo bisogno.
Quindi, ecco cosa stavo cercando di fare:
LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)
whichone=$1 # 'lys' or 'diaspar'
_LIST=LIST_$whichone
LIST=${!_LIST[*]}
Naturalmente, leggere attentamente la pagina man di Bash mostra che questo non funzionerà come previsto perché l'ultima riga restituisce semplicemente gli indici della "matrice" $_LIST
(non una matrice).
In ogni caso, quanto segue dovrebbe fare il lavoro (come sottolineato):
LIST=($(eval echo \${$_LIST[*]}))
o ... (il percorso che ho seguito, alla fine):
LIST_lys="lys1 lys2"
...
LIST=(${!_LIST})
Supponendo, ovviamente, che gli elementi non contengano spazi bianchi.
[@]
al puntatore_LIST="LIST_${whichone}[@]"
e poi, usaLIST=("${!_LIST}")
per copiare l'array. È consigliabile utilizzare i nomi delle variabili minuscole per evitare conflitti con le variabili di ambiente (maiuscole).