Creo que la respuesta que busca está implícita (si no se indica) en la respuesta de Vinko , aunque no se explica simplemente. Para distinguir si VAR está configurado pero vacío o no, puede usar:
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
Probablemente pueda combinar las dos pruebas en la segunda línea en una con:
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Sin embargo, si lee la documentación de Autoconf, encontrará que no recomiendan combinar términos con ' -a
' y recomiendan usar pruebas simples separadas combinadas con &&
. No he encontrado un sistema donde haya un problema; eso no significa que no existían (pero probablemente son extremadamente raros en estos días, incluso si no fueran tan raros en el pasado distante).
Puede encontrar los detalles de estas y otras expansiones de parámetros de shell relacionados , el comando test
o[
y las expresiones condicionales en el manual de Bash.
Recientemente me preguntaron por correo electrónico sobre esta respuesta con la pregunta:
Usas dos pruebas, y entiendo bien la segunda, pero no la primera. Más precisamente, no entiendo la necesidad de expansión variable
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
¿No lograría esto lo mismo?
if [ -z "${VAR}" ]; then echo VAR is not set at all; fi
Pregunta justa: la respuesta es 'No, su alternativa más simple no hace lo mismo'.
Supongamos que escribo esto antes de su prueba:
VAR=
Su prueba dirá "VAR no está configurado en absoluto", pero el mío dirá (por implicación porque no tiene eco) "VAR está configurado pero su valor puede estar vacío". Prueba este 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
)
El resultado es:
JL:1 VAR is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all
En el segundo par de pruebas, la variable se establece, pero se establece en el valor vacío. Esta es la distinción que hacen las anotaciones ${VAR=value}
y ${VAR:=value}
. Lo mismo para ${VAR-value}
y ${VAR:-value}
, y ${VAR+value}
y ${VAR:+value}
, y así sucesivamente.
Como Gili señala en su respuesta , si corres bash
con la set -o nounset
opción, entonces la respuesta básica anterior falla unbound variable
. Se remedia fácilmente:
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
O puede cancelar la set -o nounset
opción con set +u
(que set -u
es equivalente a set -o nounset
).