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