Comment savoir si une variable est vide ou non dans Bash

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

236
demandé sur codeforester 2010-06-17 15:00:37

10 réponses

dans bash au moins les tests de commande suivants si $var est vide :

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

La commande man test est votre ami.

346
répondu Jay 2018-01-22 17:33:17

Présuming bash:

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi
94
répondu ChristopheD 2016-08-11 15:42:07

j'ai aussi vu

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

qui est évidemment très robuste et indépendante de la coque.

il y a aussi une différence entre" vide "et"débranché". Voir comment dire si une chaîne de caractères n'est pas définie dans un script shell bash? .

46
répondu Daniel Andersson 2017-05-23 11:55:03
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 renvoie la chaîne vide.

29
répondu alexli 2012-10-05 17:36:16
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
8
répondu pixelbeat 2010-06-18 10:46:45
if [[ "$variable" == "" ]] ...
7
répondu Amardeep AC9MF 2010-06-17 11:02:44

la question demande Comment vérifier si une variable est une chaîne vide et les meilleures réponses sont déjà données pour cela.

Mais j'ai atterri ici après une période passée la programmation en php et ce que je cherchais en fait était un chèque comme la fonction vide en php travailler dans un shell bash.

Après avoir lu les réponses j'ai réalisé que je ne pensais pas correctement à bash, mais en tout cas à ce moment-là une fonction comme vide en php aurait été tellement pratique dans mon code bash.

Comme je pense que cela peut arriver à d'autres, j'ai décidé de convertir la fonction vide php en bash



Selon le manuel php :

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

  • "(une chaîne vide)
  • 0 (0 comme un entier)
  • 0.0 (0 comme flotteur)
  • " 0 "(0 comme une chaîne)
  • un tableau vide
  • une variable déclarée, mais sans valeur

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

function empty
{
    local var=""

    # 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

ayant dit que dans une logique de bash les contrôles sur zéro dans cette fonction peut causer des problèmes secondaires imho, n'importe qui utilisant cette fonction devrait évaluer ce risque et peut-être décider de couper ces chèques en laissant seulement le premier.

6
répondu Luca Borrione 2012-08-31 20:27:29

cela retournera true si une variable est désactivée ou définie à 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
6
répondu 3kstc 2015-11-04 00:50:19

vous pouvez faire la distinction entre les variables non activées et les variables qui sont définies et vides:

is_empty() {
    local var_name=""
    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 qui va causer une erreur lors de la lecture des variables non activées, ce qui 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 .

2
répondu dimid 2016-06-15 14:39:28

pour vérifier si la variable v n'est pas définie

if [ "$v" == "" ]; then
   echo "v not set"
fi
1
répondu smishra 2016-06-06 23:33:13