Pregunta

¿Cómo puedo comprobar si una variable está vacía en Bash?

¿Fue útil?

Solución

En bash, al menos, las siguientes pruebas de comando $ var si está vacía

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

El comando man test es su amigo.

Otros consejos

Presuming bash:

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi

También he visto

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

lo que obviamente es muy robusto y cáscara independiente.

Además, hay una diferencia entre el "vacío" y "desactivada". Ver Cómo saber si una cadena no se define en una secuencia de comandos shell bash? .

if [ ${foo:+1} ]
then
    echo "yes"
fi

impresiones yes si se establece la variable. ${foo:+1} devolverá 1 cuando se establece la variable, en caso contrario devolverá una cadena vacía.

if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}

Esto devolverá true si una variable no está definida o el conjunto de 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

La pregunta pide cómo comprobar 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 pasó programando en php y lo que en realidad estaba buscando era un cheque como el función de vacío en php de trabajo en un shell bash.
Después de leer las respuestas me di cuenta 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 taaaan útil en mi código bash.
Como creo que esto puede suceder a los demás, decidí convertir la función php vacío en bash

De acuerdo con la php manual de :
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 un flotador)
  •     
  • "0" (0 como una cadena)
  •     
  • una matriz vacía
  •     
  • una variable declarada, pero sin un valor

Por supuesto, el nula y false de los casos no se puede 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 fiesta de los controles de cero en esta función pueden causar problemas secundarios en mi humilde opinión, cualquier persona que utilice esta función debe evaluar este riesgo y tal vez decida cortar esos cheques dejando sólo el primero.

Es posible que desee distinguir entre variables no definidas y las variables que se establecen y vacío:

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

Resultados:

set and non-empty
set and empty
unset

Por cierto, recomiendo el uso de set -u lo que provocará un error al leer variables no definidas, esto puede ahorrarle de desastres como

rm -rf $dir

Se puede leer sobre esto y otras mejores prácticas para un "modo estricto" aquí .

Para comprobar si la variable v no se establece

if [ "$v" == "" ]; then
   echo "v not set"
fi
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top