Was bedeutet dieser Stil in Bash?
${PUBLIC_INTERFACE:-eth0}
Was ist der Zweck von :-
?
Wenn $PUBLIC_INTERFACE
vorhanden 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.
:-
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}
parameter
word
parameter
.
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
fc
ist das Ergebnis der Erweiterung ${FCEDIT:-${EDITOR:-vi}}
: $FCEDIT
falls definiert oder sonst $EDITOR
definiert 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 -u
ist 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 var
es nicht festgelegt ist, obwohl dies möglicherweise legitim ist.
Der Weg dahin verwendet [[ ${var:-} ]]
stattdessen und set -u
wird 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
)?