${!ARRAYNAME[@]}
mezzi "gli indici di ARRAYNAME
". Come indicato nello bash man page dal momento che è impostato ARRAYNAME
, ma come stringa, non come array, restituisce 0
.
Ecco una soluzione utilizzando eval
.
#!/usr/bin/env bash
ARRAYNAME='FRUITS'
FRUITS=(APPLE BANANA ORANGE)
eval array=\(\${${ARRAYNAME}[@]} \)
for fruit in "${array[@]}"; do
echo ${fruit}
done
Cosa si erano originariamente cercando di fare era creare un Indirect Reference. Questi sono stati introdotti in bash versione 2 e sono stati pensati per sostituire in gran parte la necessità di eval
quando si cerca di ottenere un comportamento simile alla riflessione nella shell.
Quello che devi fare quando si utilizza riferimenti indiretti con gli array è includere il [@]
nel vostro indovinare il nome della variabile:
#!/usr/bin/env bash
ARRAYNAME='FRUITS'
FRUITS=(APPLE BANANA ORANGE)
array="${ARRAYNAME}[@]"
for fruit in "${!array}"; do
echo $fruit
done
Detto questo, è una cosa da usare riferimenti indiretti a questo esempio banale, ma, come indicato nel link fornito da Dennis Williamson, dovresti esitare a usarli nelle sceneggiature del mondo reale. Sono tutti ma garantiti per rendere il tuo codice più confuso del necessario. Di solito è possibile ottenere la funzionalità necessaria con una matrice associativa.
fonte
2012-06-24 20:07:16
Si prega di vedere [BashFAQ/006] (http://mywiki.wooledge.org/BashFAQ/006). –