2012-05-25 17 views
26

Ich habe die Variable $foo="something" und verwenden möchte:Bash - variable Variablen

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

"etwas" Echo zu bekommen.

+2

Bitte sehen [BashFAQ/006] (http://mywiki.wooledge.org/BashFAQ/006). Außerdem sollten Sie nicht versuchen, ein Dollarzeichen auf der linken Seite einer Aufgabe zu verwenden. –

Antwort

51

In bash können Sie $ {! Variable} verwenden, um Variablenvariablen zu verwenden.

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

Viel besser als meine Antwort. – mkb

+0

@mkb Ich wusste nicht, eval :-) – dAm2K

+0

in 'sh' es heißt schlechte Substitution. Irgendeine Idee, wie man es in 'sh' macht? –

5

eval echo \"\$$bar\" würde es tun.

+5

Beachten Sie die [Sicherheitsimplikationen von 'eval'] (http://mywiki.wooledge.org/BashFAQ/048). –

+0

Diese Lösung hat den Vorteil, POSIX-kompatibel für Nicht-Bash-Shells (z. B. Lightweight-Umgebungen wie eingebettete Systeme oder Docker-Container) zu sein. Und Sie können den Wert einer anderen Variablen zuweisen wie folgt: '' 'sh var = $ (eval echo \ "\ $$ bar \") ' '' –

6

Die akzeptierte Antwort ist großartig. @Edison hat jedoch gefragt, wie man das Gleiche für Arrays tun soll. Der Trick besteht darin, dass Sie möchten, dass Ihre Variable das "[@]" enthält, so dass das Array mit dem "!" Erweitert wird. Aktivieren Sie diese Funktion, um Variablen Dump:

$ function dump_variables() { 
    for var in "[email protected]"; do 
     echo "$var=${!var}" 
    done 
} 
$ STRING="Hello World" 
$ ARRAY=("ab" "cd") 
$ dump_variables STRING ARRAY ARRAY[@] 

Diese Ausgänge:

STRING=Hello World 
ARRAY=ab 
ARRAY[@]=ab cd 

Wenn als nur ARRAY gegeben, wird das erste Element gezeigt, wie das ist, was durch die ! erweitert wird. Wenn Sie das Format ARRAY[@] angeben, wird das Array und alle seine Werte erweitert.

+0

Guter Punkt zum Umgang mit Arrays. Irgendeine Idee, wie man die * Indizes * eines Arrays bekommt? Das [Handbuch] (http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion) zeigt an, dass dies normalerweise mit '$ {! ARRAY [@]}' geschieht, was scheint Konflikt mit der Variablen-Indirektionssyntax. – dimo414

+0

@ dimo414 Ja, die Schlüssel durch Indirection zu bekommen, ist komplizierter. Sie müssten nur den Namen übergeben und dann die Erweiterung in der Methode ausführen: 'local -a 'keys = (" $ {!' "$ Var" '[@]} ")' '. Der [Indirection-Artikel zu Bash Hackers] (http://wiki.bash-hackers.org/syntax/arrays#indirection) geht tiefer. – bishop

0

Um es deutlich zu machen, wie es mit Arrays zu tun:

arr=('a' 'b' 'c') 
# construct a var assigning the string representation 
# of the variable (array) as its value: 
var=arr[@]   
echo "${!var}"