Wie kann ich in Bash den Variablennamen und nicht den Variablenwert wiedergeben? [geschlossen]

18

Angenommen, ich habe eine Variable varin Bash. Ich kann ihm einen Wert zuweisen. Zum Beispiel mache ich daraus einen String:

var="Test"

Ich möchte echoden Namen var, nicht den Wert von var. (Ich kann das letztere mit machen echo $var, aber ich möchte eigentlich das erstere machen.)

Die Antwort auf diese Frage von SO sagt zu verwenden echo ${!var}, aber wenn ich das tue, gebe ich nur eine leere Zeile zurück. Zum Beispiel dieses Bash-Skript

#!/bin/bash

echo "Hi"
var="Test"
echo ${!var}
echo "Bye"

gibt diese Ausgabe zurück:

Hi

Bye

mit nur einer Leerzeile zwischen Hi und Bye anstelle von var . Was mache ich falsch?

Ich starte Bash 4.1.5 (1) unter Ubuntu 10.04.4 .

Andrew
quelle
11
Äh ... nur echo var?
Braiam
5
Ich verstehe den Punkt nicht wirklich. Wie @Braiam hervorhebt, werden Sie den Namen der Variablen immer kennen und immer in der Lage sein, ihn zu drucken, da Sie ihn zuerst definieren. Was versuchst du eigentlich zu tun?
terdon
3
Ich denke, Sie haben die Drift der SO-Lösung verpasst. tryvar=Test; Test=SO; echo ${!var}
iruvar
Ich verstehe es auch nicht, aber was versuchst du zu tun? echo '$ var'
Renan Vicente
Ich bin sehr gespannt, bitte sagen Sie uns, wofür Sie das gebraucht haben!
Bubakazouba

Antworten:

22

Die Shell-Parameter-Erweiterung $ {! Name @} oder $ {! Name *} könnte den Trick machen,

$ foo=bar
$ var_name=(${!foo@})
$ echo $var_name" = "$foo
foo = bar

Obwohl machbar, kann ich mir den Nutzen davon nicht vorstellen ...

xae
quelle
2
Beachten Sie, dass Sie erhalten, wenn foonicht definiert, aber definiert foobarist foobar. Andere Alternativen: var_name=${-+foo}(oder ${foo+foo}) var_name=$'foo', var_name=$"foo":-)
Stéphane Chazelas
1
Wenn zwei Variablen sichtbar ${!foo@}wären , foo und foobar, die beide definiert sind, würde der Ausdruck zu auswerten foo foobar. Wie die Antwort bemerkt, ist sein Nutzen schwer vorstellbar.
CppNoob
29

Wenn Sie einfach einen statischen Variablennamen ausgeben möchten, können Sie das $-Zeichen umgehen:

echo \$var
mjturner
quelle
3
Dies sollte die akzeptierte Lösung sein.
David Poxon
9
Nicht im geringsten!! Diese Antwort ist keine gute Lösung. Dies wird einfach ausgegeben $var, aber es ist nutzlos, wenn der Variablenname dynamisch ist. Angenommen, Sie müssen eine Gruppe von Umgebungsvariablen filtern, die mit a beginnen PREFIX_, aber Sie wissen nichts über die Größe der Gruppe oder die darin enthaltenen Variablennamen. Die akzeptierte Lösung ist für dieses Szenario besser geeignet.
Héctor Valverde Pareja
aka var_name = "$ (echo \ $ var)"
Yordan Georgiev