Shell: Variablenname bestehend aus Variablen ?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
uljanow
Beiträge: 529
Registriert: 20.09.2005 21:14:00

Shell: Variablenname bestehend aus Variablen ?

Beitrag von uljanow » 05.12.2007 14:12:44

Hi,
ich finde irgendwie keinen Weg um auf den Inhalt der Variablen one_two in diesem Beispiel zu kommen:

Code: Alles auswählen

#!/bin/sh

foo="one"
bar="two"
one_two="empty"

eval ${foo}_${bar}="full"

echo $one_two
Ausgabe: Ich würde gerne auf den alten wert "empty" zugreifen wollen. Konstruktionen wie eval ${${foo}_${bar}} funktionieren nicht.

Jemand eine Idee ?

Benutzeravatar
uljanow
Beiträge: 529
Registriert: 20.09.2005 21:14:00

Beitrag von uljanow » 05.12.2007 16:02:34

Code: Alles auswählen

eval echo \$${foo}_${bar}

gelöst.

yeti

Beitrag von yeti » 05.12.2007 16:26:14

'man bash' hat geschrieben:If the first character of parameter is an exclamation point, a level of variable indirection is introduced. Bash uses the value of the variable formed from the rest of parameter as the name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value of parameter itself. This is known as indirect expansion. The exceptions to this are the expansions of ${!prefix*} and ${!name[@]} described below. The exclamation point must immediately follow the left brace in order to introduce indirection.

Code: Alles auswählen

(yeti@xs3:5)~$ cat xxx
#!/bin/sh

foo="one"
bar="two"

one_two="empty"

helper=${foo}_${bar}

echo ${!helper}
(yeti@xs3:5)~$ ./xxx
empty
... mit Bash als Sh klappt es... aber wenn es nicht jede Sh kann, würd ich in die erste Zeile des Skriptes doch lieber Shebang-Bash schreiben...

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Beitrag von Duff » 05.12.2007 17:14:29

Da wäre ich wohl nie drauf gekommen.

Was bedeutet denn ${!helper} , also das ! in dem ganzen?
Oh, yeah!

Antworten