Ich lese " Bash Guide für Anfänger ". Es sagt:
Wenn das erste Zeichen von
PARAMETER
ein Ausrufezeichen ist, verwendet Bash den Wert der Variablen, die aus dem Rest von gebildet wird,PARAMETER
als Namen der Variablen. Diese Variable wird dann erweitert und dieser Wert wird im Rest der Substitution anstelle des Werts von sichPARAMETER
selbst verwendet. Dies wird als indirekte Expansion bezeichnet.
Das gegebene Beispiel ist:
franky ~> echo ${!N*} NNTPPORT NNTPSERVER NPX_PLUGIN_PATH
Ich verstehe hier nicht ganz:
der Wert der Variablen, die aus dem Rest von gebildet wird
PARAMETER
Wie das PARAMETER
gerade ist !N*
, dann
der Rest von
PARAMETER
ist einfach N*
. Wie könnte dies eine Variable bilden? Hat Bash dort alle möglichen Befehle durchsucht?
quelle
Es scheint eine Ausnahme zu geben, wenn die angegebene "Indirektion"
*
wie hier mit a endet . In diesem Fall werden alle Variablennamen angegeben, die mit dem von Ihnen angegebenen Teil beginnen (N
hier). Bash kann das, weil es Variablen verfolgt und weiß, welche existieren.Wahre Indirektion ist folgende:
Angenommen, ich habe eine Variable
$VARIABLE
auf42
und ich habe eine andere Variable auf$NAME
gesetztVARIABLE
.${!NAME}
werde mir geben42
. Sie verwenden den Wert einer Variablen, um den Namen einer anderen Variablen anzugeben:quelle
Ja, es wird nach allen möglichen Erweiterungen von Variablen nach dem! Gesucht. Wenn Sie getan hätten:
du würdest nur bekommen
NPX_PLUGIN_PATH
.Betrachten Sie das folgende Beispiel:
quelle
${!my*}
zu myA, myB erweitert wird, wird myA mit seinem aktuellen Wert exportiert und myB wird auf "bye" gesetzt und exportiert. Nicht sehr nützlich.Bei der Indirektionsverarbeitung ist eine Ausnahme aufgetreten. Wenn das letzte Zeichen lautet
*
, werden alle Variablen mit dem zuvor angegebenen Präfix zurückgegeben.quelle
*
Fall, ist das dasselbe wie${${VAR}}
?${${VAR}}
kurz beschreibbar als${$VAR}
, ist nicht legal, da$VAR
eine Zeichenfolge zurückgegeben wird, die dem$
Vorzeichen nicht folgen kann . Um eine Zeichenfolge als Variablennamen zu verwenden, müssen Sie eine Indirektionsebene einführen (wie in der ursprünglichen Frage selbst angegeben), dh Sie können verwenden${!VAR}
, die genau das tut, was Sie erwarten würden (fälschlicherweise, aber verständlich)${$VAR}
.In diesem GNU-Dokument finden Sie Informationen zu Bash
https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html#Shell-Parameter-Expansion
Grundsätzlich wird die indirekte Erweiterung jedoch nicht
${!prefix*}
als eine der Ausnahmen ausgeführt. In Ihrem Beispiel ist N das Präfix.Das Dokument erklärt, was indirekte Expansion in Bash ist
quelle