Ich habe die Variable $foo="something"
und verwenden möchte:Bash - variable Variablen
bar="foo"; echo $($bar)
"etwas" Echo zu bekommen.
Ich habe die Variable $foo="something"
und verwenden möchte:Bash - variable Variablen
bar="foo"; echo $($bar)
"etwas" Echo zu bekommen.
eval echo \"\$$bar\"
würde es tun.
Beachten Sie die [Sicherheitsimplikationen von 'eval'] (http://mywiki.wooledge.org/BashFAQ/048). –
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 \") ' '' –
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.
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
@ 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
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}"
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. –