Ich schaue mir ein Skript an, das Folgendes enthält:
if [ "${PS1-}" ]; then
Das Nachziehen -
stört mich ein bisschen, weil es nicht der Posix- oder Bash-Standardsyntax entspricht. Ist das eine arkane Syntax, die es schon immer gab, oder ein Tippfehler? Verweise auf Normen / Dokumente sind willkommen.
Normalerweise würde ich es codieren:
if [ "$PS1" ]; then
Was ist richtiger oder gibt es einen Unterschied zwischen ihnen?
zsh
ist die einzige mir bekannte Hülle, die die kolonfreien Varianten explizit erwähnt, anstatt nur zu notieren, was das Weglassen des Doppelpunkts bewirkt.Die Variablenerweiterung
${parameter:-word}
verwendet den Wert von,$parameter
wenn er festgelegt ist, und nicht null (keine leere Zeichenfolge), andernfalls wird die Zeichenfolge verwendetword
.Wenn Sie das weglassen,
:
wird nicht geprüft, ob der Wert leer ist, sondern nur, ob er nicht gesetzt ist oder nicht.Dies bedeutet, dass
${PS1-}
der Wert auf den Wert von erweitert wird,$PS1
wenn er festgelegt ist, und auf einen leeren String, wenn er leer oder nicht festgelegt ist. In diesem Fall ist dies genau das Gleiche, als${PS1:-}
ob der folgende String-
ebenfalls leer wäre.Der Unterschied zwischen
"${PS1-}"
und"$PS1"
ist subtil, wie @Rakesh Sharma feststellt: Beide werden auf den Wert von$PS1
oder auf eine leere Zeichenfolge erweitert, wenn sie nicht festgelegt ist. Die Ausnahme ist, wennset -u
aktiv ist. In diesem Fall würde das Erweitern nicht festgelegter Variablen einen Fehler verursachen . Der von festgelegte (leere) Standardwert"${PS1-}"
umgeht dies und erweitert einen nicht festgelegten WertPS1
ohne Fehler auf den leeren String.Dies ist die Standardsyntax ( stammt aus der Bourne-Shell in den späten 70er Jahren ), ebenso wie einige andere, ähnliche Erweiterungen.
quelle
"$PS1"
, daPS1
es leer ist, wenn es leer ist, und die Anführungszeichen verhindern, dass das Wort vollständig verschwindet.set -u
nicht in Kraft ist. Wenn die Option nounset aktiviert ist, gibt "$ PS1" => einen Fehler aus. "$ {PS-}" wird nicht.${parameter:-word}
der Wert von$parameter
NON-NULL verwendet wird. In allen anderen Fällen (dh entweder gesetzt, aber NULL oder nicht gesetzt) wird es verwendetword
. Ihr Wortlaut:if its set or null
set AND nonnull
=> sich selbst verwenden. Andernfalls (set but NULL OR unset
) => Wort verwenden.Die Syntax:
und ein spezielles Formular:
Ist die gültige Syntax in der POSIX-Shell , bedeutet die Verwendung des Standardwerts,
word
wennparameter
nicht gesetzt oder null.Normalerweise ist mit
word
leer, dann:und:
oder:
sind gleichwertig.
Unter der Auswirkung von
set -u
bewirken jedoch alle nicht gesetzten Variablen, dass die Shell beendet wird.${parameter-}
wird verwendet, um diese strenge Regel zu umgehen. Es funktioniert in beiden Fällen, also ist es korrekter.quelle