Unter normalen Umständen ${FOO-}
verhält sich genauso wie ${FOO}
.
Allerdings mit set -u
, wird die Erweiterung von nicht gesetzten Variablen standardmäßig zu einem Fehler.
Also ${FOO}
könnte ein Fehler sein, aber ${FOO-}
wird es nie sein.
Variablen innerhalb eines ${...}
werden als „Parametererweiterung“ bezeichnet.
Suchen Sie nach diesem Begriff im Online-Handbuch oder im eigentlichen Handbuch (Zeile 792).
Die ${var-}
form ist ähnlich wie ${var:-}
. Der Unterschied wird nur eine Zeile vor dem :-
erklärt Erweiterung (Zeile 810):
... bash testet auf einen Parameter, der nicht gesetzt oder null ist. Das Weglassen des Doppelpunkts ergibt einen Test nur für einen Parameter, der nicht gesetzt ist.
Daher testet dieses Formular nur, wenn eine Variable nicht gesetzt ist (und nicht null) und ersetzt die gesamte Erweiterung ${...}
für den Wert nach -
, was in diesem Fall null ist .
Daher die ${var-}
wird zu:
- Der Wert von var, wenn var einen Wert hat (und nicht null).
- Auch der Wert von var (der Doppelpunkt :fehlt!), wenn var null ist:
''
, also:auch null. - Der Wert nach dem - (in diesem Fall null
''
), wenn var nicht gesetzt ist.
All das ist wirklich nur:
- Erweitern Sie auf
''
wenn var entweder nicht gesetzt oder null ist. - Auf den Wert von var erweitern (wenn var einen Wert hat).
Daher ändert die Erweiterung weder den Wert von var noch ihre Erweiterung, sondern vermeidet nur einen möglichen Fehler, wenn die Shell die Option nounset
hat eingestellt.
Dieser Code stoppt bei beiden Verwendungen von $var
:
#!/bin/bash
set -u
unset var
echo "variable $var"
[[ $var ]] && echo "var set"
Dieser Code wird jedoch ohne Fehler ausgeführt:
#!/bin/bash
set -u
unset var
echo "variable ${var-}"
[[ ${var-} ]] && echo "var set"