web-dev-qa-db-fra.com

Comment savoir si une variable est vide ou non dans Bash

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

251
Tree

En bash au moins, la commande suivante teste si $ var est vide:

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

La commande man test est votre ami.

366
Jay

Présumant bash:

var=""

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

J'ai aussi vu

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

ce qui est évidemment très robuste et indépendant de Shell.

De plus, il existe une différence entre "vide" et "non défini". Voir Comment savoir si une chaîne n'est pas définie dans un script bash shell? .

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

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

30
alexli
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
9
pixelbeat
if [[ "$variable" == "" ]] ...
8
Amardeep AC9MF

Ceci retournera true si une variable est non définie ou définie sur 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
7
3kstc

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 en programmation en php et j’étais en train de chercher un contrôle comme la fonction vide dans php travaillant dans un shell bash.
Après avoir lu les réponses, je me suis rendu compte que je ne pensais pas correctement en bash, mais de toute façon, à ce moment-là, une fonction comme vide en php aurait été vraiment utile dans mon bash code.
Comme je pense que cela peut arriver à d’autres, j’ai décidé de convertir la fonction php empty 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 valeurs suivantes:

  • "" (une chaîne vide)
  • 0 (0 as an integer)
  • 0.0 (0 en float)
  • "0" (0 sous forme de chaîne)
  • un tableau vide
  • une variable déclarée, mais sans valeur

Bien sûr, les cas null et false ne peuvent pas être convertis en bash, ils sont donc 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

les 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 bash, les vérifications de zéro dans cette fonction peuvent également causer des problèmes secondaires, toute personne utilisant cette fonction devrait évaluer ce risque et peut-être décider de supprimer ces vérifications en ne laissant que le premier. .

6
Luca Borrione

Vous souhaiterez peut-être distinguer les variables non définies des variables 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

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

rm -rf $dir

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

2
dimid

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

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