Ich habe mir ein paar Skripte angesehen, die andere geschrieben haben (insbesondere Red Hat), und viele ihrer Variablen wurden mit der folgenden Notation zugewiesen
VARIABLE1="${VARIABLE1:-some_val}"
oder einige erweitern andere Variablen
VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
Was bringt es, diese Notation zu verwenden, anstatt nur die Werte direkt zu deklarieren (z. B. VARIABLE1=some_val
)?
Gibt es Vorteile für diese Notation oder mögliche Fehler, die verhindert würden?
Hat das :-
in diesem Zusammenhang eine bestimmte Bedeutung?
bash
shell-script
scripting
variable
Rothgar
quelle
quelle
man bash
; Suchen Sie nach dem Block "Parametererweiterung" (bei ca. 28%). Diese Zuweisungen sind z. B. Standardfunktionen: "Verwenden Sie den Standardwert nur, wenn noch keine festgelegt wurden."Antworten:
Mit dieser Technik kann einer Variablen ein Wert zugewiesen werden, wenn eine andere Variable leer oder undefiniert ist. HINWEIS: Diese "andere Variable" kann dieselbe oder eine andere Variable sein.
Auszug
HINWEIS: Dieses Formular funktioniert auch
${parameter-word}
. Wenn Sie eine vollständige Liste aller in Bash verfügbaren Formen der Parametererweiterung sehen möchten, empfehle ich Ihnen dringend, sich dieses Thema im Wiki von Bash Hacker mit dem Titel " Parametererweiterung " anzuschauen .Beispiele
Variable existiert nicht Variable existiertDas Gleiche kann durch Auswerten anderer Variablen oder durch Ausführen von Befehlen im Standardwertteil der Notation erreicht werden.
Mehr Beispiele
Sie können auch eine etwas andere Notation verwenden, wenn es nur so ist
VARX=${VARX-<def. value>}
.Oben wurde
$VAR1
&$VAR2
bereits mit der Zeichenfolge "hat einen anderen Wert"$VAR3
definiert, war jedoch undefiniert, sodass stattdessen der Standardwert verwendet wurde0
.Ein anderes Beispiel
Prüfen und Zuweisen mit
:=
NotationZuletzt erwähne ich den praktischen Operator
:=
. Dies führt eine Überprüfung durch und weist einen Wert zu, wenn die zu testende Variable leer oder undefiniert ist.Beispiel
Beachten Sie, dass
$VAR1
jetzt eingestellt ist. Der Bediener:=
erledigte den Test und die Aufgabe in einem Arbeitsgang.Wenn der Wert jedoch zuvor festgelegt wurde, bleibt er in Ruhe.
Handy Dandy Referenztabelle
Verweise
quelle
bash
. Die${var:-word}
im Q ist, aber nicht die${var-word}
oben. Die POSIX-Dokumentation hat jedoch eine schöne Tabelle, die es möglicherweise wert ist, in diese Antwort kopiert zu werden - pubs.opengroup.org/onlinepubs/9699919799/utilities/…echo "${FOO:=default}"
ist toll, wenn Sie tatsächlich die wollenecho
. Aber wenn Sie dies nicht tun, versuchen Sie es mit dem:
eingebauten ...: ${FOO:=default}
Ihr$FOO
istdefault
wie oben eingestellt (dh wenn nicht bereits eingestellt). Aber es gibt kein Echo$FOO
in dem Prozess.${4:-$VAR}
wird funktionieren.@slm hat bereits die POSIX-Dokumente enthalten, die sehr hilfreich sind, aber nicht wirklich erläutern , wie diese Parameter kombiniert werden können, um sich gegenseitig zu beeinflussen. Dieses Formular ist hier noch nicht erwähnt:
Dies ist ein Auszug aus einer anderen meiner Antworten , und ich denke, er zeigt sehr gut, wie diese funktionieren:
Ein weiteres Beispiel aus demselben :
Das obige Beispiel nutzt alle 4 Formen der POSIX-Parametersubstitution und ihre verschiedenen
:colon null
odernot null
Tests. Es gibt mehr Informationen im obigen Link und hier ist es wieder .Eine andere Sache, über die die Leute oft nicht nachdenken,
${parameter:+expansion}
ist, wie nützlich sie in einem Here-Dokument sein kann. Hier ist ein weiterer Auszug aus einer anderen Antwort :OBEN
Hier legen Sie einige Standardeinstellungen fest und bereiten das Drucken vor, wenn Sie dazu aufgefordert werden ...
MITTE
Hier definieren Sie andere Funktionen, um Ihre Druckfunktion basierend auf deren Ergebnissen aufzurufen ...
UNTERSEITE
Sie haben jetzt alles eingerichtet. Hier können Sie Ihre Ergebnisse ausführen und abrufen.
ERGEBNISSE
Ich werde gleich auf das Warum eingehen, aber das Ausführen des obigen Befehls führt zu den folgenden Ergebnissen:
WIE ES FUNKTIONIERT:
Das Hauptmerkmal hierbei ist das Konzept von.
conditional ${parameter} expansion.
Sie können eine Variable nur dann auf einen Wert setzen, wenn sie in der folgenden Form nicht gesetzt oder null ist:Wenn Sie stattdessen nur eine nicht festgelegte Variable
:colon
festlegen möchten , lassen Sie die Werte weg, und Nullwerte bleiben unverändert .ON SCOPE:
Möglicherweise bemerken Sie dies im obigen Beispiel
$PLACE
und$RESULT
werden geändert, wenn die Einstellung über ausgeführt wirdparameter expansion
, obwohl_top_of_script_pr()
sie bereits aufgerufen wurde. Möglicherweise werden sie beim Ausführen festgelegt. Der Grund, warum dies funktioniert, ist, dass_top_of_script_pr()
es sich um eine( subshelled )
Funktion handelt - ich habe sie eingeschlossen,parens
anstatt{ curly braces }
sie für die anderen zu verwenden. Da es in einer Subshell aufgerufen wird, ist jede Variable, die es setzt,locally scoped
und wenn es zu seiner übergeordneten Shell zurückkehrt, verschwinden diese Werte.Aber wenn
_more_important_function()
legt$ACTION
esglobally scoped
so wirkt es_less_important_function()'s
zweite Auswertung von$ACTION
da_less_important_function()
Sätze$ACTION
nur über${parameter:=expansion}.
quelle
Persönliche Erfahrung.
Ich verwende dieses Format manchmal in meinen Skripten, um Werte ad-hoc zu überschreiben, zB wenn ich Folgendes habe:
Ich kann rennen:
ohne den ursprünglichen Standardwert von ändern zu müssen
SOMETHING
.quelle