Comment puis-je vérifier si une variable est vide dans Bash?
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.
Présumant bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
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? .
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.
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
if [[ "$variable" == "" ]] ...
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
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:
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. .
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 .
Pour vérifier si la variable v n'est pas définie
if [ "$v" == "" ]; then
echo "v not set"
fi