Comment trouver ou non une variable est vide dans Bash
Question
Comment puis-je vérifier si une variable est vide Bash?
La solution
Dans bash au moins les tests de commande suivante si $ var est vide :
if [[ -z "$var" ]]; then
#do what you want
fi
La commande man test
est votre ami.
Autres conseils
Présumant bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
Je l'ai aussi vu
if [ "x$variable" = "x" ]; then ...
ce qui est évidemment très robuste et indépendante shell.
En outre, il y a une différence entre « vide » et « hors service ». Voir Comment savoir si une chaîne 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 retournera une chaîne vide.
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
retourne true
si une variable est pas définie ou à 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
question demande Comment vérifier si une variable est une chaîne vide et les meilleures réponses sont déjà inscrits pour cela.
Mais je suis arrivé ici après une période de programmation adoptée en php et ce que je cherchais était réellement un chèque comme le Fonction vide en php travailler dans un shell bash.
Après avoir lu les réponses que je pris conscience que je ne pensais pas correctement dans bash, mais de toute façon en ce moment une fonction comme vide en php aurait été tellement utile dans mon code bash.
Comme je pense que cela peut arriver à d'autres, je décide de convertir le php fonction vide en bash
Selon le php manuel:
une variable est considérée comme vide si elle n'existe pas ou si sa valeur est l'une des options suivantes:
- "" (une chaîne vide)
- 0 (0 en tant que nombre entier)
- 0.0 (0 comme un flotteur)
- "0" (0 sous forme de chaîne)
- un tableau vide
- une variable déclarée, mais sans valeur
Bien sûr, le null et false cas ne peuvent pas être convertis en bash, donc ils sont 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
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 de bash les contrôles sur zéro dans cette fonction peut causer des problèmes secondaires IMHO, toute personne utilisant cette fonction devrait évaluer ce risque et décider peut-être de réduire ces contrôles en laissant seul le premier.
Vous pouvez vouloir distinguer entre les variables non définies et les variables qui sont 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 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 réglé
if [ "$v" == "" ]; then
echo "v not set"
fi