2012-04-30 8 views
39

Was ist die Bedeutung dieses Stils in bash?Verwendung von: - (Doppelpunkt Strich) in Bash

${PUBLIC_INTERFACE:-eth0} 

Was ist der Zweck von :-?

+0

möglich Duplikat [Wie funktioniert bash Parameter Expansionsarbeit?] (Http://stackoverflow.com/questions/3881811/how-does-bash-parameter -Expansion-Arbeit) (obwohl die Antwort hier geht ins Detail) – cmbuckley

+2

ja es ist dupliziert .. aber der Titel meiner Frage ist informativer und die Antwort, wie Sie sagten, ist besser .. danke – pahko

Antwort

53

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

Es gibt tatsächlich ein paar davon in der bash man page dokumentiert:

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

$ {parameter: = wort} 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 zugewiesen werden.

$ {parameter: Wort} Anzeige Fehler, wenn Null oder Nicht festgelegt. Wenn der Parameter null oder nicht gesetzt ist, wird die Erweiterung des Wortes (oder eine entsprechende Nachricht, wenn das Wort nicht vorhanden ist) in den Standardfehler geschrieben, und die Shell wird, falls sie nicht interaktiv ist, beendet. Andernfalls wird der Wert des Parameters ersetzt.

$ {parameter: + wort} Alternate Value verwenden. Wenn der Parameter null oder nicht gesetzt ist, wird nichts ersetzt, andernfalls wird die Wortausdehnung ersetzt.

+0

vielen Dank !! !!! – pahko

3

:- ist im ${parameter:-word}shell parameter expansion verwendet: if parameter null oder nicht gesetzt ist, dehnt es sich auf den Wert des word, andernfalls auf den Wert des parameter.

Beispiel:

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

Dies und die ähnlichen Erweiterungen mit :=, :+ und :? alle kommen in zwei Varianten: mit und ohne Doppelpunkt. Der Unterschied ist, dass die Erweiterung mit der Doppelpunkt für "Null oder Unset", während ohne der Doppelpunkt, es ist nur "Null".

beachten:

$ 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 den letzten Befehl mit fc bearbeiten aufgerufen ist das Ergebnis der Expansion ${FCEDIT:-${EDITOR:-vi}}: $FCEDIT wenn definiert ist, oder sonst $EDITOR wenn definiert ist, oder sonst vi.
    • Eine Schleife in einem Skript, das aus einer Datei lesen soll, wenn man anders als Argument und von der Standardeingabe vorgesehen ist, könnte wie folgt aussehen:

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

    set -u ist eine praktische Möglichkeit, saubereres Scripting zu erzwingen, indem das Skript abstürzt, wenn es auf eine nicht gesetzte Variable stößt, wie z. B. von this article (nicht, dass ich alles befürworte) in dort). Wenn wir überprüfen möchten, ob eine bestimmte Variable einen Wert mit [[ $var ]] hat, stirbt das Skript jetzt, wenn var nicht gesetzt ist, obwohl dies legitim sein könnte.

    Der Weg um dies zu verwenden ist [[ ${var:-} ]] statt, und set -u wird nicht beschweren. (Dies ist im Grunde mit einem Standardwert wieder, aber der Ersatzwert ist die leere Zeichenkette in diesem Fall.)

Diese Erweiterungen zum Bash nicht exklusiv sind, nebenbei bemerkt: die POSIX shell spec hat sie alle, auch.


Siehe auch BashFAQ/112, What are the advantages and disadvantages of using set -u (or set -o nounset)?

Verwandte Themen