Cómo encontrar si una variable está vacía o no en Bash

Respuestas:

383

En Bash, al menos el siguiente comando prueba si $ var está vacío :

if [[ -z "$var" ]]; then
   # Do what you want
fi

El comando man testes tu amigo.

Arrendajo
fuente
62
los corchetes dobles son inútiles aquí. puede ser simple [-z "$ var"] o incluso más fácil si prueba -z "var" .. de todos modos +1 :)
Luca Borrione
2
los corchetes dobles no son inútiles, si no lo incluyo, no sé ./test.ksh[8]: test: argument expectedcuál es la razón, pero el corchete simple no funcionó, pero el doble lo tenía.
gahlot.jaggs
8
@LucaBorrione Creo que te refieres if test -z "$var", ¿verdad?
neu242
1
Solo un comentario agregado para una situación específica no mencionada directamente en la pregunta: si la variable no está configurada y la set -uopción ha sido activada, esta prueba fallará unbound variable. En este caso, es posible que prefiera la solución de @ alexli.
Anol
3
@LucaBorrione Como una nota al margen: "[[" puede verse como "nunca inútil"; ya que usar "[[" tiene algunas ventajas sobre "[" (vea stackoverflow.com/questions/669452/… por ejemplo)
GhostCat
107

Presumiendo Bash:

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi
ChristopheD
fuente
9
La respuesta más directa es -z:[[ -z "$an_unset_or_empty_var" ]] && echo empty
glenn jackman
44
@glenn jackman: buen comentario; Es cierto que -zestá más cerca de lo que se le preguntó. Jay ha puesto esto en su respuesta, así que me abstendré de actualizar la mía y dejaré esto como está.
ChristopheD
48

Yo tambien he visto

if [ "x$variable" = "x" ]; then ...

que obviamente es muy robusto e independiente de la carcasa.

Además, hay una diferencia entre "vacío" y "no establecido". Vea Cómo saber si una cadena no está definida en un script de shell Bash .

Daniel Andersson
fuente
Me parece extraño ¿Podría por favor explicar esta solución? Gracias.
guettli
2
@guettli: si $variableestá vacío, entonces la cadena a la izquierda del operador de comparación se vuelve única x, que es igual a la cadena a la derecha del operador. [ x = x ]es "verdadero", por lo que en la práctica esto prueba si $variableestá vacío o no. Como una adición (3½ años después del hecho :-)) Nunca usaría esto yo mismo, ya que -zhace lo que probablemente quiero de una manera más clara, pero quería agregar esta respuesta ya que este método se ve con frecuencia "en la naturaleza"; quizás escrito de esta manera a propósito por personas que han tenido experiencias diferentes a las mías.
Daniel Andersson
30
if [ ${foo:+1} ]
then
    echo "yes"
fi

imprime yessi la variable está configurada. ${foo:+1}devolverá 1 cuando se establezca la variable; de ​​lo contrario, devolverá una cadena vacía.

alexli
fuente
2
Si bien no se menciona en la pregunta, una ventaja importante de esta respuesta es que funciona incluso cuando la variable no está definida y la set -uopción ( nounset) está activada. Casi todas las otras respuestas a esta pregunta fallarán unbound variableen este caso.
Anol
Esta :+notación también es útil para situaciones en las que tiene parámetros opcionales de línea de comandos que ha especificado con variables opcionales. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
Alan Porter
10
if [[ "$variable" == "" ]] ...
Amardeep AC9MF
fuente
10
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
pixelbeat
fuente
Excelente forma de omitir un var, más 1
ehime
@ehime para hacer un valor predeterminado que ${variable:-default_value}
usarías
Esta es una forma rápida de verificar la validez de una entrada de una variable y salir si no está configurada: [ "$variable" ] || exit
Marcel Sonderegger
8

Esto devolverá truesi una variable no está establecida o establecida en la cadena vacía ("").

if [ -z "$MyVar" ]
then
   echo "The variable MyVar has nothing in it."
elif ! [ -z "$MyVar" ]
then
   echo "The variable MyVar has something in it."
fi
3kstc
fuente
3
¿Por qué usarías en elif !lugar de else?
ZiggyTheHamster
1
Sólo para hacer una distinción entre los dos estados, es decir, utilizando ! [ -z "$MyVar" ]significaría que la variable podría tener algo en ella. Pero idealmente uno lo usaría else.
3kstc
6

La pregunta pregunta cómo verificar si una variable es una cadena vacía y las mejores respuestas ya están dadas para eso.

Pero llegué aquí después de un período de programación en PHP, y en realidad estaba buscando una verificación como la función vacía en PHP trabajando en un shell Bash.

Después de leer las respuestas, me di cuenta de que no estaba pensando correctamente en Bash, pero de todos modos en ese momento una función como vacío en PHP habría sido muy útil en mi código de Bash.

Como creo que esto puede sucederle a otros, decidí convertir la función vacía de PHP en Bash.

De acuerdo con el manual de PHP :

una variable se considera vacía si no existe o si su valor es uno de los siguientes:

  • "" (una cadena vacía)
  • 0 (0 como un entero)
  • 0.0 (0 como flotante)
  • "0" (0 como una cadena)
  • una matriz vacía
  • una variable declarada, pero sin un valor

Por supuesto, los casos nulo y falso no se pueden convertir en bash, por lo que se omiten.

function empty
{
    local var="$1"

    # Return true if:
    # 1.    var is a null string ("" as empty string)
    # 2.    a non set variable is passed
    # 3.    a declared variable or array but without a value is passed
    # 4.    an empty array is passed
    if test -z "$var"
    then
        [[ $( echo "1" ) ]]
        return

    # Return true if var is zero (0 as an integer or "0" as a string)
    elif [ "$var" == 0 2> /dev/null ]
    then
        [[ $( echo "1" ) ]]
        return

    # Return true if var is 0.0 (0 as a float)
    elif [ "$var" == 0.0 2> /dev/null ]
    then
        [[ $( echo "1" ) ]]
        return
    fi

    [[ $( echo "" ) ]]
}



Ejemplo de uso:

if empty "${var}"
    then
        echo "empty"
    else
        echo "not empty"
fi



Demostración:
el siguiente fragmento:

#!/bin/bash

vars=(
    ""
    0
    0.0
    "0"
    1
    "string"
    " "
)

for (( i=0; i<${#vars[@]}; i++ ))
do
    var="${vars[$i]}"

    if empty "${var}"
        then
            what="empty"
        else
            what="not empty"
    fi
    echo "VAR \"$var\" is $what"
done

exit

salidas:

VAR "" is empty
VAR "0" is empty
VAR "0.0" is empty
VAR "0" is empty
VAR "1" is not empty
VAR "string" is not empty
VAR " " is not empty

Una vez dicho esto, en una lógica Bash, las comprobaciones de cero en esta función pueden causar problemas secundarios, cualquiera que use esta función debería evaluar este riesgo y tal vez decidir cortar esas comprobaciones dejando solo el primero.

Luca Borrione
fuente
2

Es posible que desee distinguir entre las variables no definidas y las variables establecidas y vacías:

is_empty() {
    local var_name="$1"
    local var_value="${!var_name}"
    if [[ -v "$var_name" ]]; then
       if [[ -n "$var_value" ]]; then
         echo "set and non-empty"
       else
         echo "set and empty"
       fi
    else
       echo "unset"
    fi
}

str="foo"
empty=""
is_empty str
is_empty empty
is_empty none

Resultado:

set and non-empty
set and empty
unset

Por cierto, recomiendo usar set -ulo que causará un error al leer variables no establecidas, esto puede salvarlo de desastres como

rm -rf $dir

Puede leer sobre esta y otras mejores prácticas para un "modo estricto" aquí .

tenue
fuente
Gracias por la referencia de modo estricto!
paulcm
1

Para verificar si la variable v no está establecida

if [ "$v" == "" ]; then
   echo "v not set"
fi
smishra
fuente