2012-05-25 22 views
26

Ho la variabile $foo="something" e vorrebbe utilizzare:Bash - variabili variabili

bar="foo"; echo $($bar) 

per ottenere "qualcosa", fa eco.

+2

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. –

risposta

51

In bash, è possibile utilizzare $ {! Variabile} per utilizzare variabili variabili.

foo="something" 
bar="foo" 
echo "${!bar}" 
+0

Molto meglio la mia risposta. – mkb

+0

@mkb non sapevo che valesse :-) – dAm2K

+0

in 'sh' si dice una brutta sostituzione. Qualche idea su come farlo in 'sh'? –

5

eval echo \"\$$bar\" lo farebbe.

+5

Siate consapevoli delle [implicazioni di sicurezza di 'eval'] (http://mywiki.wooledge.org/BashFAQ/048). –

+0

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 \") ' '' –

6

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.

+0

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

+0

@ 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

0

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}" 
Problemi correlati