Dieser Beitrag enthält eigentlich zwei getrennte Fragen, aber ich denke, dass eine Gruppierung dieser Fragen mehr Kontext ergibt. Ich habe diese Frage zu Anführungszeichen für Variablen durchgearbeitet, verstehe aber nicht ganz, was Variablenerweiterung überhaupt bedeutet. Meine erste Frage lautet also:
- Was ist variable Expansion unter Unix / Linux?
Ein zweiter Teil meiner Frage bezieht sich auf folgende Begriffe:
- glob
- Teilt
Was bedeuten die oben genannten und wie wirken sie sich auf die variable Expansion aus? In der Antwort auf die ursprüngliche Frage wird Folgendes erwähnt:
Stellen Sie sich das Fehlen von Anführungszeichen (in Listenkontexten) als den Operator split + glob vor.
Als ob echo $ test echo glob wäre (split ("$ test")).
Ich konnte keine Antworten finden, die direkt auf das Konzept des Globbing und Splitting eingehen , sondern diese Begriffe direkt für die Beantwortung anderer Fragen wie dieser jüngsten verwenden .
quelle
Antworten:
Variablenerweiterung (der Standardbegriff ist Parametererweiterung und wird manchmal auch als Variablensubstitution bezeichnet ) bedeutet im Grunde, die Variable durch ihren Wert zu ersetzen. Genauer gesagt bedeutet dies, dass das
$VARIABLE
Konstrukt (oder${VARIABLE}
oder${VARIABLE#TEXT}
andere Konstrukte) durch einen anderen Text ersetzt wird, der aus dem Wert der Variablen erstellt wird. Dieser andere Text ist die Erweiterung der Variablen.Der Expansionsprozess läuft wie folgt ab. (Ich diskutiere nur den allgemeinen Fall, einige Shell-Einstellungen und -Erweiterungen ändern das Verhalten.)
${VARIABLE#TEXT}
und der Wert der Variablen mit beginntTEXT
, entfernen SieTEXT
vom Anfang des Werts.IFS
kann so geändert werden, dass sie nur mit Leerzeichen geteilt wird.) Das Ergebnis ist also keine Zeichenfolge mehr, sondern eine Liste von Zeichenfolgen. Diese Liste kann leer sein, wenn der Wert nur Leerzeichen enthält.Angenommen, dass der Variable
foo
enthälta* b* c*
und das aktuelle Verzeichnis enthält die Dateienbar
,baz
undpaz
. Dann${foo#??}
wird wie folgt erweitert:a* b* c*
.#??
bedeutet, dass die ersten beiden Zeichen entfernt werden, was zu einer 6-stelligen Zeichenfolgeb* c*
(mit einem anfänglichen Leerzeichen) führt.b*
undc*
.b*
als Muster interpretierte Zeichenfolge entspricht zwei Dateien:bar
undbaz
. Die Zeichenfolgec*
stimmt mit keiner Datei überein, sodass sie in Ruhe gelassen wird. Das Ergebnis ist eine Liste von drei Strings:bar
,baz
,c*
.Zum Beispiel
echo ${foo#??}
Ausdruckebar baz c*
(der Befehlecho
verbindet seine Argumente mit einem Leerzeichen dazwischen).Weitere Einzelheiten finden Sie unter:
quelle
$var
) und andere Arten von Parametern wie$1
,$#
,$?
,$-
...glob / split
Ich nehme zuerst den Glob / Split. @ Stephanes Antwort , mit der Sie verlinkt sind, ist die Verwendung dieser Begriffe im Allgemeinen. Sie sind keine tatsächlichen Befehle oder ähnliches, sondern nur Pseudooperationen.
Das
split("$test")
würde den Inhalt von "$ test" in ein "Array" von Elementen aufteilen.Das
glob(...)
würde dann darauf achten, eines dieser Elemente zu erweitern, die Shell-Globbing-Zeichen wie*
oder Bereiche enthalten[1-2]
.Beispiel
Angenommen, unsere Zeichenfolge
$test
lautet wie folgt.Nehmen wir auch an, wir haben ein Verzeichnis mit einigen Dateien.
Wenn wir nun versuchen, es ohne Anführungszeichen wiederzugeben, sollten Sie feststellen, dass unsere Zeichenfolge in Leerzeichen aufgeteilt wurde und dann alle glühenden Zeichen erweitert wurden.
Wenn wir die Variable jedoch als Argument für die
echo
Übergabe in Anführungszeichen setzen, erhalten wir die ursprüngliche Literalzeichenfolge.variable Ausdehnung
Der Begriff Variablenerweiterung soll die Grundoperation abdecken, die die Shell als Teil ihrer Grundoperationen ausführt. Die Shell ist für das Parsen der Eingabe verantwortlich und führt diese Eingabe aus, sobald sie als syntaktisch korrekt erachtet wird.
In unserem vorherigen Beispiel. Als die Variable nicht
$test
inecho
Anführungszeichen gesetzt wurde, forderten wir die Shell auf, diese Argumente aufzuteilen und sie dann zu globalisieren.Als es in Anführungszeichen gesetzt wurde, deaktivierten wir dieses Feature im Wesentlichen mit den Variablen, die wir in doppelte Anführungszeichen eingeschlossen hatten.
Beispiel
Hier sind einige zusätzliche Beispiele für Globbing und Splitting.
Glob / Splitting erfolgt automatisch
Glob / Splitting über doppelte Anführungszeichen deaktiviert
quelle