Comment savoir si une variable est vide ou non dans Bash

262

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

Arbre
la source
2
Quel genre de script shell? *rien?
TJ Crowder
8
script shell bash
Tree
serverfault.com/questions/7503/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

383

Dans Bash, au moins la commande suivante teste si $ var est vide :

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

La commande man testest votre ami.

Geai
la source
62
les crochets doubles sont inutiles ici. cela peut être simple [-z "$ var"] ou encore plus simple si test -z "var" .. de toute façon +1 :)
Luca Borrione
2
les doubles crochets ne sont pas inutiles, si je ne comprends pas, je ne sais pas ./test.ksh[8]: test: argument expectedpourquoi, mais le simple crochet ne fonctionnait pas, mais le double l'avait.
gahlot.jaggs
8
@ Lucucorrione Je pense que tu veux dire if test -z "$var", non?
neu242
1
Juste un commentaire supplémentaire pour une situation spécifique non directement mentionnée dans la question: si la variable n'est pas définie et que l' set -uoption a été activée, ce test échouera avec unbound variable. Dans ce cas, vous préférerez peut-être la solution de @ alexli.
anol
3
@LucaBorrione Tout comme une note secondaire tardive: "[[" peut être vu comme "jamais inutile"; que l'utilisation de "[[" présente certains avantages par rapport à "[" (voir stackoverflow.com/questions/669452/… par exemple)
GhostCat
107

Présumer Bash:

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi
ChristopheD
la source
9
La réponse la plus directe est -z:[[ -z "$an_unset_or_empty_var" ]] && echo empty
glenn jackman
4
@glenn jackman: bon commentaire; c'est vrai que -zc'est plus proche de ce qui a été demandé. Jay a mis cela dans sa réponse, donc je m'abstiendrai de mettre à jour la mienne et la laisser telle quelle.
ChristopheD
48

J'ai vu aussi

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

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

En outre, 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 shell Bash .

Daniel Andersson
la source
Ça me semble étrange. Pourriez-vous s'il vous plaît expliquer cette solution. Je vous remercie.
guettli
2
@guettli: Si $variableest vide, alors la chaîne à gauche de l'opérateur de comparaison devient seule x, qui est alors égale à la chaîne à droite de l'opérateur. [ x = x ]est "vrai", donc dans la pratique, ce test $variableest vide ou non. En complément (3½ ans après le fait :-)) je ne l'utiliserais jamais moi-même car -zfait ce que je veux probablement de manière plus claire, mais je voulais ajouter cette réponse car cette méthode est souvent vue "à l'état sauvage"; peut-être écrit de cette façon exprès par des gens qui ont eu des expériences différentes de la mienne.
Daniel Andersson
30
if [ ${foo:+1} ]
then
    echo "yes"
fi

s'imprime yessi la variable est définie. ${foo:+1}renverra 1 lorsque la variable est définie, sinon il renverra une chaîne vide.

alexli
la source
2
Bien que cela ne soit pas mentionné dans la question, un avantage important de cette réponse est qu'elle fonctionne même lorsque la variable n'est pas définie et que l' set -uoption ( nounset) est activée. Presque toutes les autres réponses à cette question échoueront unbound variabledans ce cas.
anol
Cette :+notation est également utile dans les situations où vous avez des paramètres de ligne de commande facultatifs que vous avez spécifiés avec des variables facultatives. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
Alan Porter
10
if [[ "$variable" == "" ]] ...
Amardeep AC9MF
la source
10
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
pixelbeat
la source
Excellent moyen de désactiver par défaut un var, plus 1
ehime
@ehime pour créer une valeur par défaut que vous utiliseriez${variable:-default_value}
warvariuc
C'est un moyen rapide de vérifier la validité d'une entrée de variable et de sortir si non paramétré: [ "$variable" ] || exit
Marcel Sonderegger
8

Cela retournera truesi une variable n'est pas 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
3kstc
la source
3
Pourquoi voudriez-vous utiliser à la elif !place de else?
ZiggyTheHamster
1
Il suffit de faire une distinction entre les deux déclarations, à savoir l' utilisation ! [ -z "$MyVar" ]signifierait que la variable serait avoir quelque chose. Mais idéalement, on utiliserait else.
3kstc
6

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 de programmation passée en PHP, et je cherchais en fait une vérification comme la fonction vide en PHP fonctionnant dans un shell Bash.

Après avoir lu les réponses, j'ai réalisé que je ne pensais pas correctement dans Bash, mais de toute façon à 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 PHP vide dans 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 sous forme d'entier)
  • 0,0 (0 comme flottant)
  • "0" (0 sous forme de chaîne)
  • un tableau vide
  • une variable déclarée, mais sans valeur

Bien sûr, les cas nuls et faux 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 sur zéro dans cette fonction peuvent entraîner des problèmes secondaires à mon humble avis, toute personne utilisant cette fonction devrait évaluer ce risque et peut-être décider de supprimer ces vérifications en ne laissant que la première.

Luca Borrione
la source
2

Vous souhaiterez peut-être faire la distinction entre les variables non définies et les 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

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

rm -rf $dir

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

dimide
la source
Merci pour la référence de mode stricte!
paulcm
1

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

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