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 testo[ 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 bashcon l' set -o nounsetopzione, 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 nounsetopzione con set +u( set -uequivalente a set -o nounset).