Dans des circonstances normales, ${FOO-}
se comporte exactement comme ${FOO}
.
Cependant, avec set -u
, l'expansion des variables non définies devient une erreur par défaut.
Donc ${FOO}
peut être une erreur, mais ${FOO-}
ne le sera jamais.
Variables à l'intérieur d'un ${...}
sont appelés « Expansion des paramètres ».
Recherchez ce terme dans le manuel en ligne ou dans le manuel réel (ligne 792).
Le ${var-}
form est similaire dans sa forme à ${var:-}
. La différence est expliquée juste une ligne avant le :-
extension (ligne 810):
... bash teste un paramètre non défini ou nul. L'omission des deux-points entraîne un test uniquement pour un paramètre non défini.
Ainsi, ce formulaire teste uniquement lorsqu'une variable n'est pas définie (et non nul), et remplace toute l'expansion ${...}
pour la valeur après le -
, qui dans ce cas est null .
Par conséquent, le ${var-}
devient :
- La valeur de var lorsque var a une valeur (et non null).
- Aussi la valeur de var (les deux-points :sont manquants !) lorsque var est nul :
''
, donc :également null. - La valeur après le - (dans ce cas, null
''
) si var n'est pas défini.
Tout ça c'est vraiment :
- Développer jusqu'à
''
lorsque var est non défini ou nul. - Développez jusqu'à la valeur de var (lorsque var a une valeur).
Par conséquent, l'expansion ne change rien à la valeur de var, ni à son expansion, évite simplement une erreur possible si le shell a l'option nounset
ensemble.
Ce code s'arrêtera sur les deux utilisations de $var
:
#!/bin/bash
set -u
unset var
echo "variable $var"
[[ $var ]] && echo "var set"
Cependant ce code s'exécutera sans erreur :
#!/bin/bash
set -u
unset var
echo "variable ${var-}"
[[ ${var-} ]] && echo "var set"