Penso che la risposta che cercate è implicito (se non dichiarato) di Vinko 's risposta , anche se non è scritto semplicemente. Per distinguere se VAR è impostato ma vuoto o no, è possibile utilizzare:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "$VAR" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Probabilmente puoi combinare i due test sulla seconda riga in uno con:
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Tuttavia, se leggi la documentazione di Autoconf, scoprirai che non raccomandano di combinare i termini con " -a
" e raccomandano di usare test semplici separati combinati con &&
. Non ho riscontrato un sistema in cui si è verificato un problema; ciò non significa che non esistessero (ma probabilmente sono estremamente rari in questi giorni, anche se non erano così rari in un lontano passato).
Puoi trovare i dettagli di questi, e altre relative espansioni dei parametri della shell , il comando test
o[
ed espressioni condizionali nel manuale di Bash.
Recentemente mi è stato chiesto via e-mail su questa risposta con la domanda:
Usi due test e capisco bene il secondo, ma non il primo. Più precisamente non capisco la necessità di un'espansione variabile
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
Ciò non compirebbe lo stesso?
if [ -z "${VAR}" ]; then echo VAR is not set at all; fi
Domanda equa: la risposta è "No, la tua alternativa più semplice non fa la stessa cosa".
Supponiamo che scrivo questo prima del test:
VAR=
Il tuo test dirà "VAR non è impostato affatto", ma il mio dirà (implicitamente perché non riecheggia nulla) "VAR è impostato ma il suo valore potrebbe essere vuoto". Prova questo script:
(
unset VAR
if [ -z "${VAR+xxx}" ]; then echo JL:1 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:1 VAR is not set at all; fi
VAR=
if [ -z "${VAR+xxx}" ]; then echo JL:2 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:2 VAR is not set at all; fi
)
L'output è:
JL:1 VAR is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all
Nella seconda coppia di test, la variabile è impostata, ma è impostata sul valore vuoto. Questa è la distinzione che fanno le notazioni ${VAR=value}
e ${VAR:=value}
. Idem per ${VAR-value}
e ${VAR:-value}
, e ${VAR+value}
e ${VAR:+value}
, e così via.
Come sottolinea Gili nella sua risposta , se corri bash
con l' set -o nounset
opzione, allora la risposta di base sopra fallisce unbound variable
. È facilmente risolto:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "${VAR-}" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Oppure potresti annullare l' set -o nounset
opzione con set +u
( set -u
equivalente a set -o nounset
).