GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Erweiterung einer Shell-Variablen und Auswirkung von Glob und Split darauf?

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:

  1. Was ist Variablenerweiterung in unix/linux sprechen?

Ein zweiter Teil meiner Frage bezieht sich auf die folgenden Begriffe:

  1. Kugel
  2. 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.)

  1. Nehmen Sie den Wert der Variablen, die eine Zeichenkette ist. Wenn die Variable nicht definiert ist, verwenden Sie die leere Zeichenfolge.
  2. Wenn das Konstrukt eine Transformation enthält, wenden Sie sie an. Wenn das Konstrukt beispielsweise ${VARIABLE#TEXT} ist , und der Wert der Variablen beginnt mit TEXT , entfernen Sie TEXT vom Anfang des Werts.
  3. 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.
  4. 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.
  5. 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:

  1. Der Wert der Variablen ist die 8-stellige Zeichenfolge a* b* c* .
  2. #?? bedeutet, die ersten beiden Zeichen wegzuschneiden, was zu der 6-stelligen Zeichenfolge  b* c* führt (mit einem anfänglichen Leerzeichen).
  3. Wenn sich die Erweiterung in einem Listenkontext befindet (d. h. nicht in doppelten Anführungszeichen oder einem anderen ähnlichen Kontext), fahren Sie fort.
  4. Teilen Sie die Zeichenfolge in durch Leerzeichen getrennte Wörter auf, was zu einer Liste mit zwei Zeichenfolgen führt:b* und c* .
  5. Die Zeichenfolge b* , als Muster interpretiert, stimmt mit zwei Dateien überein:bar und baz . Die Zeichenfolge c* 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).

Verwandte:Was sollte man NICHT auf eine SSD legen?

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?

Linux
  1. Unterschied zwischen Login-Shell und Nicht-Login-Shell?

  2. Ausgabe des Befehls in Shell-Variable speichern?

  3. Wie erhalte ich die eigene IP-Adresse und speichere sie in einer Variablen in einem Shell-Skript?

  4. Welche Shells unterstützen keine Dollar-Klammer-Expansion und verlangen Backticks?

  5. Wie verzögere ich die Variablenerweiterung?

5 Möglichkeiten, Ihr Linux-Terminal aufzuteilen

So installieren und verwenden Sie Nu Shell unter Linux

Exportbefehl in Linux erklärt

Was ist Subshell in Linux?

Shell - Variableninhalte in eine Datei schreiben

Variablenbereich für Bash-Shell-Skripte und Funktionen im Skript