HOWTO · Bash
Cómo comprobar si una variable de Bash está vacía
Aprenda cuatro formas en Bash de comprobar si una variable contiene una cadena vacía, incluido el entrecomillado seguro y cómo se comportan los valores no definidos y los que solo contienen espacios en blanco.
En esta página
Para un valor de Bash proporcionado, entrecomille su expansión para que el shell lo pase como un solo argumento. Este script imprime un valor etiquetado:
value='Bash'
if [ -z "$value" ]; then
printf '%s\n' 'No value supplied'
else
printf 'Value: %s\n' "$value"
fi
Value: Bash
El comando test (también escrito como [ ... ]) devuelve éxito cuando la cadena expandida tiene cero caracteres. Una variable no definida se expande a una cadena vacía en un shell de Bash normal, por lo que -z trata igual los valores no definidos y los explícitamente vacíos. Con set -u, use ${value-} para proporcionar un valor predeterminado antes de la comprobación. Un valor como 0 o una cadena de espacios no está vacío; la comprobación examina los caracteres, no si una palabra parece verdadera.
Comprobar si una variable de Bash está vacía con -z
El comando test (también escrito como [ ... ]) devuelve un estado de éxito cuando la cadena expandida tiene cero caracteres. Un estado distinto de cero significa que contiene al menos un carácter. La comprobación en sí no imprime ningún mensaje; la instrucción if selecciona qué comando se ejecuta.
value=''
if [ -z "$value" ]; then
printf '%s\n' 'value is empty'
else
printf '%s\n' 'value is not empty'
fi
value is empty
Para una variable no definida, la misma comprobación entrecomillada tiene éxito en la configuración habitual del shell. Con set -u, escriba [ -z "${value-}" ] en su lugar para que la expansión siga estando definida. El comando de corchetes es un comando del shell cuyo éxito o fracaso se representa mediante su estado de salida; no imprime true ni false automáticamente.
Comprobar si una variable de Bash no está vacía con -n
Use -n para la comprobación complementaria: devuelve éxito cuando la cadena expandida tiene al menos un carácter. La rama then se ejecuta para un valor no vacío, y else se ejecuta cuando la comprobación falla, incluido cuando el valor está vacío.
value='Bash'
if [ -n "$value" ]; then
printf '%s\n' 'value is not empty'
else
printf '%s\n' 'value is empty'
fi
value is not empty
El entrecomillado es importante porque conserva la expansión como un solo argumento. Como con -z, use ${value-} dentro de las comillas si el script puede ejecutarse con set -u y la variable puede no estar definida. La opción -n es especialmente legible cuando la siguiente acción solo debe ocurrir después de que se haya proporcionado un valor.
Comparar una variable de Bash con una cadena vacía
Puede comparar un valor directamente con una cadena vacía mediante la expresión condicional [[ ... ]] de Bash. La expansión entrecomillada deja clara la intención, y una cadena que contiene espacios sigue sin estar vacía porque esos espacios son caracteres.
value=' '
if [[ "$value" == "" ]]; then
printf '%s\n' 'value is empty'
else
printf '%s\n' 'value is not empty'
fi
value is not empty
Este ejemplo toma la segunda rama: los espacios no desaparecen dentro de [[ ... ]]. Para los scripts que usan set -u, compare ${value-} para que una variable no definida se trate como una cadena vacía.
Comprobar una variable con la expansión de parámetros ${parameter:+word}
La forma ${parameter:+word} se expande a word cuando el parámetro está definido y no es nulo. Se expande a nada cuando el parámetro no está definido o contiene una cadena vacía. Compruebe la expansión entrecomillándola:
value='Bash'
if [ "${value:+present}" ]; then
printf '%s\n' 'value is set and nonempty'
else
printf '%s\n' 'value is unset or empty'
fi
value is set and nonempty
Esta expresión idiomática es útil cuando la distinción que necesita es «definido y no vacío» frente a «no definido o vacío». No distingue entre estos dos últimos estados. Para diferenciar un parámetro no definido de uno definido pero vacío, use la comprobación [[ -v value ]] de Bash como una prueba separada.