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 0invece.
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).