Creo que la respuesta que buscas está implícita (si no está indicada) en Vinko 's answer, aunque no está explicado simplemente. Para distinguir si VAR está asignada, pero vacía o no se establece, se puede utilizar:
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
Es probable que pueda combinar las dos pruebas en la segunda línea en uno con:
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Sin embargo, si se 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 quiere decir que no solían existir (pero probablemente sean extremadamente raros actualmente, incluso si no fueran tan raros en el pasado distante).
Puede encontrar los detalles de estos y otros relacionados shell parameter expansions, el comando test
or [
y conditional expressions en el manual de Bash.
poco me preguntaron por correo electrónico acerca de esta respuesta con la pregunta:
utiliza dos pruebas, y entiendo que la segunda también, pero no el primero. 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
Feria pregunta - la respuesta es 'No, su alternativa más simple no hace lo mismo'.
Supongamos que escribo esto antes de la prueba:
VAR=
Su prueba dirá "VAR no se ajusta en absoluto", pero la mía va a decir (por implicación, ya que se hace eco de nada) "VAR está asignada pero su el valor puede estar vacío ". Trate de 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
)
La salida 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, se establece la variable, sino que se establece en el valor vacío. Esta es la distinción que hacen las anotaciones ${VAR=value}
y ${VAR:=value}
. Ídem para ${VAR-value}
y ${VAR:-value}
, y ${VAR+value}
y ${VAR:+value}
, y así sucesivamente.
Como Gili señala en su answer, si ejecuta bash
con la opción set -o nounset
, entonces la respuesta básica anterior falla con unbound variable
. Se soluciona 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 usted podría cancelar la opción set -o nounset
con set +u
(set -u
equivalente a set -o nounset
).
tenga la costumbre de usar [-z "$ mystr"] en lugar de [-z $ mystr] –
cómo hacer lo inverso? Me refiero a cuando la cadena no es nula – flow
@flow: ¿Qué pasa con '[-n" $ {VAR + x} "] && echo not null' – Lekensteyn