Dieser Beitrag enthält eigentlich zwei separate Fragen, aber ich denke, wenn Sie sie zusammenfassen, erhalten Sie mehr Kontext. Ich bin diese Frage zu Anführungszeichen um Variablen durchgegangen, aber ich verstehe nicht ganz, was Variablenerweiterung ist in erster Linie bedeuten. Also meine erste Frage ist:
- Was ist Variablenerweiterung in unix/linux sprechen?
Ein zweiter Teil meiner Frage bezieht sich auf die folgenden Begriffe:
- Kugel
- aufteilen
Was bedeuten die oben genannten Punkte und wie wirken sie sich auf die Variablenausdehnung aus? Die Antwort auf die ursprüngliche Frage erwähnt Folgendes:
Stellen Sie sich das Fehlen von Anführungszeichen (in Listenkontexten) als den Operator split+glob
vor.
Als wäre echo $test echo glob(split(“$test”)).
Ich konnte keine Antworten finden, die sich direkt mit dem Konzept des Globbing befassen und Aufteilen sondern verwendet diese Begriffe direkt bei der Beantwortung anderer Fragen wie dieser kürzlichen.
Akzeptierte Antwort:
Variablenerweiterung (Der Standardbegriff ist Parametererweiterung , und es wird manchmal auch Variablensubstitution genannt ) bedeutet im Grunde, die Variable durch ihren Wert zu ersetzen. Genauer gesagt bedeutet es das Ersetzen von $VARIABLE
Konstrukt (oder ${VARIABLE}
oder ${VARIABLE#TEXT}
oder andere Konstrukte) durch einen anderen Text, der aus dem Wert der Variablen aufgebaut ist. 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.)
- Nehmen Sie den Wert der Variablen, die eine Zeichenkette ist. Wenn die Variable nicht definiert ist, verwenden Sie die leere Zeichenfolge.
- Wenn das Konstrukt eine Transformation enthält, wenden Sie sie an. Wenn das Konstrukt beispielsweise
${VARIABLE#TEXT}
ist , und der Wert der Variablen beginnt mitTEXT
, entfernen SieTEXT
vom Anfang des Werts. - Wenn der Kontext ein einzelnes Wort erfordert (z. B. in doppelten Anführungszeichen oder auf der rechten Seite einer Aufgabe oder in einem Hier-Dokument), hören Sie hier auf. Andernfalls fahren Sie mit den nächsten Schritten fort.
- Teilen den Wert in separate Wörter bei jeder Folge von Leerzeichen. (Die Variable
IFS
kann geändert werden, um an anderen Zeichen als Leerzeichen zu trennen.) Das Ergebnis ist also kein String mehr, sondern eine Liste von Strings. Diese Liste kann leer sein, wenn der Wert nur Leerzeichen enthält. - Behandeln Sie jedes Element der Liste als Platzhaltermuster für Dateinamen, d. h. als Glob . Wenn das Muster einigen Dateien entspricht, wird es durch die Liste der übereinstimmenden Dateinamen ersetzt, andernfalls wird es in Ruhe gelassen.
Angenommen, die Variable foo
enthält a* b* c*
und das aktuelle Verzeichnis enthält die Dateien bar
, baz
und paz
. Dann ${foo#??}
wird wie folgt erweitert:
- Der Wert der Variablen ist die 8-stellige Zeichenfolge
a* b* c*
. #??
bedeutet, die ersten beiden Zeichen wegzuschneiden, was zu der 6-stelligen Zeichenfolgeb* c*
führt (mit einem anfänglichen Leerzeichen).- Wenn sich die Erweiterung in einem Listenkontext befindet (d. h. nicht in doppelten Anführungszeichen oder einem anderen ähnlichen Kontext), fahren Sie fort.
- Teilen Sie die Zeichenfolge in durch Leerzeichen getrennte Wörter auf, was zu einer Liste mit zwei Zeichenfolgen führt:
b*
undc*
. - Die Zeichenfolge
b*
, als Muster interpretiert, stimmt mit zwei Dateien überein:bar
undbaz
. Die Zeichenfolgec*
stimmt mit keiner Datei überein, also wird sie allein gelassen. Das Ergebnis ist eine Liste mit drei Strings:bar
,baz
,c*
.
Zum Beispiel echo ${foo#??}
gibt bar baz c*
aus (Der Befehl echo
verbindet seine Argumente mit einem Leerzeichen dazwischen).
Weitere Einzelheiten finden Sie unter:
- Parametererweiterung im POSIX-Standard, gefolgt von Feldaufteilung und Pfadnamenerweiterung
- Shell-Parametererweiterung im Bash-Handbuch, gefolgt von Worttrennung und Dateinamenerweiterung
- $VAR vs ${VAR} und zitieren oder nicht zitieren
- Wann sind doppelte Anführungszeichen erforderlich?