Ho la variabile $foo="something"
e vorrebbe utilizzare:Bash - variabili variabili
bar="foo"; echo $($bar)
per ottenere "qualcosa", fa eco.
Ho la variabile $foo="something"
e vorrebbe utilizzare:Bash - variabili variabili
bar="foo"; echo $($bar)
per ottenere "qualcosa", fa eco.
eval echo \"\$$bar\"
lo farebbe.
Siate consapevoli delle [implicazioni di sicurezza di 'eval'] (http://mywiki.wooledge.org/BashFAQ/048). –
Questa soluzione ha il vantaggio di essere compatibile con POSIX per shell non Bash (ad esempio, ambienti leggeri come sistemi embedded o contenitori Docker). E si può assegnare il valore di un'altra variabile in questo modo: '' 'sh var = $ (eval echo \ "\ $$ bar \") ' '' –
La risposta accettata è ottima. Tuttavia, @Edison ha chiesto come fare lo stesso per gli array. Il trucco è che vuoi che la tua variabile mantenga "[@]", in modo che l'array sia espanso con "!". Check out questa funzione per eseguire il dump variabili:
$ function dump_variables() {
for var in "[email protected]"; do
echo "$var=${!var}"
done
}
$ STRING="Hello World"
$ ARRAY=("ab" "cd")
$ dump_variables STRING ARRAY ARRAY[@]
Questo uscite:
STRING=Hello World
ARRAY=ab
ARRAY[@]=ab cd
Quando somministrato come solo ARRAY
, il primo elemento è mostrato come questo è ciò che è ampliata con l'!
. Dando il formato ARRAY[@]
, ottieni l'array e tutti i suoi valori espansi.
Un buon punto sulla gestione degli array. Qualche idea su come ottenere gli * indici * di un array? Il [manuale] (http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion) indica che questo è normalmente fatto con '$ {! ARRAY [@]}', che sembra entrare in conflitto con la sintassi di indirezione variabile. – dimo414
@ dimo414 Sì, ottenere le chiavi tramite l'indirizzamento indiretto è più complicato. Dovresti passare solo il nome, quindi eseguire l'espansione nel metodo: 'local -a 'keys = (" $ {!' "$ Var" '[@]} ")''. L'articolo [indirection su Bash Hackers] (http://wiki.bash-hackers.org/syntax/arrays#indirection) entra in profondità. – bishop
Per rendere più chiaro come si fa con gli array:
arr=('a' 'b' 'c')
# construct a var assigning the string representation
# of the variable (array) as its value:
var=arr[@]
echo "${!var}"
Si prega di vedere [BashFAQ/006] (http://mywiki.wooledge.org/BashFAQ/006). Inoltre, non dovresti provare a utilizzare un simbolo del dollaro sul lato sinistro di un compito. –