Erklärung des Doppelpunktoperators in ": $ {foo = value}"

76

Ich verstehe den Doppelpunktoperator in bash, der sich wie eine Null verhält , und ich weiß, dass er sowohl bei der Parametererweiterung als auch auf andere Weise verwendet wird, aber kann jemand dies erklären:

: ${SOMETHING='value'}

Aus Experimenten weiß ich, dass dies die Umgebungsvariable $SOMETHINGauf setzt, 'value'aber warum?

"Nur weil es so ist" ist eine gültige Antwort, aber bitte verweisen Sie mich auf die Dokumentation dafür (die ich anscheinend nicht finden kann), oder ein richtiger Name für diese Verwendung wäre nützlich. Ich hoffe jedoch, dass es eine aufschlussreichere Erklärung gibt.

Peter Coulton
quelle
2
Beachten Sie, dass das :integrierte System in Bourne Shell und Ksh sowie in Bash vorhanden ist.
Ghoti

Antworten:

92

Der Ausdruck ${SOMETHING='value'}setzt ETWAS auf, valuewenn es nicht bereits gesetzt ist. Dies ist in vielen Situationen ein nützlicher Operator. Es wird jedoch auch der zugewiesene Wert zurückgegeben, wenn Sie also einfach ausgeführt haben

${SOMETHING='value'}

dann würde Ihre Shell versuchen, den Befehl aufzurufen value. Dies kann oder kann nicht etwas Unerwünschtes tun; Zumindest würde die Meldung "Wert: Befehl nicht gefunden" ausgegeben.

Um dies zu vermeiden, können Sie das No-Op verwenden :, das sein Argument auswertet und es dann wegwirft, anstatt es auszuführen. Dies ist hier dokumentiert .

Kilian Foth
quelle
13
Der :eingebaute Befehl ist hier dokumentiert . Es ist auch ein POSIX-Standard .
Adam Rosenfield
3
Auch hier erklärt .
X-Yuri
1
Gibt es einen Unterschied zwischen: $ {SOMETHING = "$ HMMM"} und: $ {SOMETHING: = "$ HMMM"}? Beachten Sie den zweiten Doppelpunkt im letzten Beispiel
Yury Kozlov
1
@YuryKozlov Die erste Variation ( =) verwendet den Standardwert, wenn der Parameter lautet unset. Letzteres ( :=) verwendet die Standardeinstellung, wenn der Parameter null oder unset
Dave L. ist.
7

Hier erklärt: http://tldp.org/LDP/abs/html/parameter-substitution.html

Wenn der Parameter nicht festgelegt ist, setzen Sie ihn auf den Standardwert.

Beide Formen sind nahezu gleichwertig. Das: macht nur dann einen Unterschied, wenn der Parameter $ deklariert wurde und null ist, [1] wie oben.

echo ${var=abc}   # abc
echo ${var=xyz}   # abc
# $var had already been set to abc, so it did not change.
Arnaud F.
quelle
3
Ich würde wiki.bash-hackers.org/syntax/pe oder mywiki.wooledge.org/BashFAQ/073 (und seine Links) als bessere Referenzen als das ABS (das chronisch unterbewertet ist und dazu neigt, schlechte Praktiken zu präsentieren) vorschlagen seine Beispiele).
Charles Duffy