In circostanze normali, ${FOO-}
si comporta esattamente come ${FOO}
.
Tuttavia, con set -u
, l'espansione delle variabili non impostate diventa un errore per impostazione predefinita.
Quindi ${FOO}
potrebbe essere un errore, ma ${FOO-}
non lo sarà mai.
Variabili all'interno di un ${...}
sono chiamati «Espansione dei parametri».
Cerca quel termine nel manuale online o nel manuale vero e proprio (riga 792).
Il ${var-}
form è simile nella forma a ${var:-}
. La differenza è spiegata solo una riga prima di :-
espansione (riga 810):
... bash verifica un parametro non impostato o nullo. Omettendo i due punti si ottiene un test solo per un parametro non impostato.
Pertanto, questo modulo esegue il test solo quando una variabile non è impostata (e not null) e sostituisce l'intera espansione ${...}
per il valore dopo -
, che in questo caso è null .
Pertanto, il ${var-}
diventa:
- Il valore di var quando var ha un valore (e non null).
- Anche il valore di var (mancano i due punti:!) quando var è nullo:
''
, quindi:anche null. - Il valore dopo il - (in questo caso, null
''
) se var non è impostato.
Tutto ciò che è davvero:
- Espandi a
''
quando var è unset o null. - Espandi al valore di var (quando var ha un valore).
Pertanto, l'espansione non cambia nulla riguardo al valore di var, né la sua espansione, evita solo un possibile errore se la shell ha l'opzione nounset
impostato.
Questo codice si fermerà su entrambi gli usi di $var
:
#!/bin/bash
set -u
unset var
echo "variable $var"
[[ $var ]] && echo "var set"
Tuttavia questo codice verrà eseguito senza errori:
#!/bin/bash
set -u
unset var
echo "variable ${var-}"
[[ ${var-} ]] && echo "var set"