Verwendung von: - (Doppelpunkt) in Bash

70

Was bedeutet dieser Stil in Bash?

${PUBLIC_INTERFACE:-eth0}

Was ist der Zweck von :-?

pahko
quelle

Antworten:

97

Wenn $PUBLIC_INTERFACEvorhanden und nicht null, geben Sie den Wert zurück, andernfalls "eth0".

Es gibt tatsächlich einige davon, die in der Bash-Manpage dokumentiert sind :

$ {parameter: -word} Standardwerte verwenden. Wenn der Parameter nicht gesetzt oder null ist, wird die Erweiterung des Wortes ersetzt. Andernfalls wird der Wert des Parameters ersetzt.

$ {parameter: = word} Standardwerte zuweisen. Wenn der Parameter nicht gesetzt oder null ist, wird die Erweiterung des Wortes dem Parameter zugewiesen. Der Wert des Parameters wird dann ersetzt. Positionsparameter und spezielle Parameter dürfen auf diese Weise nicht zugeordnet werden.

$ {parameter :? word} Anzeigefehler bei Null oder Unset. Wenn der Parameter null oder nicht gesetzt ist, wird die Erweiterung des Wortes (oder eine entsprechende Meldung, wenn kein Wort vorhanden ist) in den Standardfehler geschrieben, und die Shell wird beendet, wenn sie nicht interaktiv ist. Andernfalls wird der Wert des Parameters ersetzt.

$ {Parameter: + Wort} Alternativwert verwenden. Wenn der Parameter null oder nicht gesetzt ist, wird nichts ersetzt, andernfalls wird die Erweiterung des Wortes ersetzt.

Tim Pote
quelle
9

:-wird in der Shell-Parametererweiterung verwendet : Wenn null oder nicht gesetzt ist, wird es auf den Wert von erweitert , andernfalls auf den Wert von${parameter:-word} parameterwordparameter .

Beispiel:

$ str=
$ echo "${str:-default}"
default

Dies und die ähnlichen Erweiterungen verwenden :=, :+und :?alle kommen in zwei Varianten: mit und ohne Doppelpunkt. Der Unterschied besteht darin, dass die Erweiterung mit dem Doppelpunkt für "null oder nicht gesetzt " beginnt , während sie ohne den Doppelpunkt nur "null" ist.

Beobachten:

$ str=                      # Null, but not unset
$ echo "${str-default}"     # Expands to value of $str, the empty string

$ echo "${str:-default}"    # Expands to "default"
default

Wo ist das nützlich? Einige Beispiele:

  • Standardwerte

    • Der Editor, der zum Bearbeiten des letzten Befehls aufgerufen wird, fcist das Ergebnis der Erweiterung ${FCEDIT:-${EDITOR:-vi}}: $FCEDITfalls definiert oder sonst $EDITORdefiniert oder sonst vi.
    • Eine Schleife in einem Skript, die aus einer Datei gelesen werden soll, wenn eine als Argument angegeben wird, und ansonsten aus der Standardeingabe, könnte folgendermaßen aussehen:

      while IFS= read -r line; do
          # do something
      done < "${1:-/dev/stdin}"
      
  • Beim Benutzen set -u

    set -uist eine praktische Möglichkeit, um sauberere Skripte zu erzwingen, indem das Skript beim Auftreffen auf eine nicht gesetzte Variable stirbt, wie dies beispielsweise in diesem Artikel beschrieben wird (nicht, dass ich alles darin unterstütze 1 ). Wenn wir überprüfen möchten, ob eine bestimmte Variable einen Wert mit hat [[ $var ]], stirbt das Skript jetzt, wenn vares nicht festgelegt ist, obwohl dies möglicherweise legitim ist.

    Der Weg dahin verwendet [[ ${var:-} ]]stattdessen und set -uwird sich nicht beschweren. (Dies verwendet grundsätzlich wieder einen Standardwert, aber der ersetzte Wert ist in diesem Fall die leere Zeichenfolge.)

Diese Erweiterungen sind übrigens nicht nur für Bash verfügbar: Die POSIX-Shell-Spezifikation enthält sie auch alle.


1 Siehe auch BashFAQ / 112, Welche Vor- und Nachteile hat die Verwendung von set -u(oder set -o nounset)?

Benjamin W.
quelle