Nehmen wir an, ich habe die folgenden Variablen deklariert:
$ var='$test'
$ test="my string"
Wenn ich deren Inhalt drucke, sehe ich Folgendes:
$ echo $var
$test
$ echo $test
my string
Ich möchte einen Weg finden, um den Inhalt des Inhalts von $var
(der der Inhalt von ist $test
) zu drucken . Also habe ich folgendes versucht:
$ echo $(echo $var)
$test
Aber hier ist das Ergebnis $test
und nicht "my string"
... Ist es möglich, den Inhalt von Variablen mit bash zu drucken?
bash
shell-script
variable
echo
variable-substitution
Rafael Muynarsk
quelle
quelle
ash
oderbash
odercsh
oderdash
... oderzsh
oder POSIX aussh
, oder müssen Sie systemübergreifend arbeiten?Antworten:
Sie können dies mit der indirekten Variablenerweiterung von bash erreichen (solange es in Ordnung ist, die
$
Referenzvariable wegzulassen):3.5.3 Shell-Parametererweiterung
quelle
Für den Fall, dass der in enthaltene Variablenname
var
mit einem Präfix versehen ist$
, können Sie Folgendes verwendeneval
:Was geschieht hier:
$var
auf den Wert erweitert$test
und erzeugt eineneval echo $test
Befehl.eval
wertet denecho $test
Ausdruck aus und erzeugt ein gewünschtes Ergebnis.Beachten Sie, dass die Verwendung
eval
im Allgemeinen gefährlich sein kann (je nachdem, was darin aufbewahrt wirdvar
). Vermeiden Sie es daher lieber. Die indirekte Erweiterungsfunktion ist für Ihren Fall besser (Sie müssen jedoch die$
Anmeldung entfernen$test
).quelle
eval
benötigen Sie zwei Ebenen mit doppelten Anführungszeicheneval echo "\"$var\""
. Wohlgemerkt, dies ändert nichts an den anderen Gefahren,eval
die Sie bei der Verwendung genannt haben .Ähnlich wie die Antwort von Jesse_b , jedoch unter Verwendung einer Namensreferenzvariablen anstelle einer Variablenumleitung (erfordert
bash
4.3+):Die Namensreferenzvariable
var
enthält den Namen der Variablen, auf die sie verweist. Wenn die Variable dereferenziert wird als$var
, wird der Wert dieser anderen Variablen zurückgegeben.bash
löst Namensreferenzen rekursiv auf:Der Vollständigkeit
bash
halber ist die Verwendung eines assoziativen Arrays (in 4.0+) auch eine Möglichkeit, dies zu lösen, abhängig von den Anforderungen:Dies bietet eine flexiblere Möglichkeit, über einen Schlüssel oder Namen, der dynamisch bestimmt werden kann, auf mehr als einen Wert zuzugreifen. Dies ist möglicherweise vorzuziehen, wenn Sie alle Werte einer bestimmten Kategorie in einem einzigen Array erfassen möchten, aber dennoch über einen bestimmten Schlüssel darauf zugreifen können (z. B. über ID zugreifbare Namen oder über Zweck zugreifbare Pfadnamen usw.), da dies nicht zu einer Verschmutzung führt der variable Namespace des Skripts.
quelle
Mit
zsh
:Mit jeder Bourne-ähnlichen Muschel
Denken Sie daran, dass in diesen Shells variable Erweiterungen in Anführungszeichen gesetzt werden müssen, um Split + Glob (
zsh
eine Ausnahme) zu vermeiden. Sieecho
können nicht für beliebige Daten verwendet werden.Da bei beiden
(e)
undeval
es eine Shell-Code-Auswertung gibt, ist es wichtig, den Inhalt von$var
Aufenthalts in Ihrer Kontrolle , da sonst die einen beliebigen Befehl Injection - Schwachstelle sein kann (gleiche mit${!var}
Ansätzen).quelle