Comment puis-je vérifier si une variable est vide dans Bash?
Comment puis-je vérifier si une variable est vide dans Bash?
Réponses:
Dans 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.
./test.ksh[8]: test: argument expected
pourquoi, mais le simple crochet ne fonctionnait pas, mais le double l'avait.
if test -z "$var"
, non?
set -u
option a été activée, ce test échouera avec unbound variable
. Dans ce cas, vous préférerez peut-être la solution de @ alexli.
Présumer Bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
c'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.
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 .
$variable
est 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 $variable
est vide ou non. En complément (3½ ans après le fait :-)) je ne l'utiliserais jamais moi-même car -z
fait 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.
if [ ${foo:+1} ]
then
echo "yes"
fi
s'imprime yes
si la variable est définie. ${foo:+1}
renverra 1 lorsque la variable est définie, sinon il renverra une chaîne vide.
set -u
option ( nounset
) est activée. Presque toutes les autres réponses à cette question échoueront unbound variable
dans ce cas.
:+
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}
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
${variable:-default_value}
[ "$variable" ] || exit
Cela retournera true
si 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
elif !
place de else
?
! [ -z "$MyVar" ]
signifierait que la variable serait avoir quelque chose. Mais idéalement, on utiliserait else
.
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:
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.
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 -u
ce 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 .