Question

Comment puis-je vérifier si une variable est vide Bash?

Était-ce utile?

La solution

Dans bash au moins les tests de commande suivante si $ var est vide :

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

La commande man test est votre ami.

Autres conseils

Présumant bash:

var=""

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

Je l'ai aussi vu

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

ce qui est évidemment très robuste et indépendante shell.

En outre, il y a une différence entre « vide » et « hors service ». Voir Comment savoir si une chaîne est pas définie dans un script shell bash? .

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

imprime yes si la variable est définie. ${foo:+1} retourne 1 lorsque la variable est définie, sinon elle retournera une chaîne vide.

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

retourne true si une variable est pas définie ou à la chaîne vide ( « »).

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

question demande Comment vérifier si une variable est une chaîne vide et les meilleures réponses sont déjà inscrits pour cela.
Mais je suis arrivé ici après une période de programmation adoptée en php et ce que je cherchais était réellement un chèque comme le Fonction vide en php travailler dans un shell bash.
Après avoir lu les réponses que je pris conscience que je ne pensais pas correctement dans bash, mais de toute façon en ce moment une fonction comme vide en php aurait été tellement utile dans mon code bash.
Comme je pense que cela peut arriver à d'autres, je décide de convertir le php fonction vide en bash

Selon le php manuel:
une variable est considérée comme vide si elle n'existe pas ou si sa valeur est l'une des options suivantes:

        
  • "" (une chaîne vide)
  •     
  • 0 (0 en tant que nombre entier)
  •     
  • 0.0 (0 comme un flotteur)
  •     
  • "0" (0 sous forme de chaîne)
  •     
  • un tableau vide
  •     
  • une variable déclarée, mais sans valeur

Bien sûr, le null et false cas ne peuvent pas être convertis en bash, donc ils sont omis.

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 "" ) ]]
}


Exemple d'utilisation:

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


Démo:
l'extrait suivant:

#!/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

sorties:

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

Cela dit dans une logique de bash les contrôles sur zéro dans cette fonction peut causer des problèmes secondaires IMHO, toute personne utilisant cette fonction devrait évaluer ce risque et décider peut-être de réduire ces contrôles en laissant seul le premier.

Vous pouvez vouloir distinguer entre les variables non définies et les variables qui sont définies et vides:

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

Résultat:

set and non-empty
set and empty
unset

BTW, je recommande d'utiliser set -u ce qui provoquera une erreur lors de la lecture des variables non définies, cela peut vous sauver de catastrophes telles que

rm -rf $dir

Vous pouvez lire à ce sujet et d'autres meilleures pratiques pour un « mode strict » ici .

Pour vérifier si la variable v n'est pas réglé

if [ "$v" == "" ]; then
   echo "v not set"
fi
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top