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)
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.
Ç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.
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}
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.
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 passedif test -z "$var"then[[ $( echo "1")]]return# Return true if var is zero (0 as an integer or "0" as a string)elif["$var"==02>/dev/null ]then[[ $( echo "1")]]return# Return true if var is 0.0 (0 as a float)elif["$var"==0.02>/dev/null ]then[[ $( echo "1")]]returnfi[[ $( echo "")]]}
Exemple d'utilisation:
if empty "${var}"then
echo "empty"else
echo "not empty"fi
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.
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 .
Réponses:
Dans Bash, au moins la commande suivante teste si $ var est vide :
La commande
man test
est votre ami.la source
./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 avecunbound variable
. Dans ce cas, vous préférerez peut-être la solution de @ alexli.Présumer Bash:
la source
-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
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 .
la source
$variable
est vide, alors la chaîne à gauche de l'opérateur de comparaison devient seulex
, 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.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.la source
set -u
option (nounset
) est activée. Presque toutes les autres réponses à cette question échouerontunbound 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}
la source
la source
${variable:-default_value}
[ "$variable" ] || exit
Cela retournera
true
si une variable n'est pas définie ou définie sur la chaîne vide ("").la source
elif !
place deelse
?! [ -z "$MyVar" ]
signifierait que la variable serait avoir quelque chose. Mais idéalement, on utiliseraitelse
.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.
Exemple d'utilisation:
Démo: l'
extrait suivant:
les sorties:
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.
la source
Vous souhaiterez peut-être faire la distinction entre les variables non définies et les variables définies et vides:
Résultat:
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 queVous pouvez lire à ce sujet et d'autres bonnes pratiques pour un "mode strict" ici .
la source
Pour vérifier si la variable v n'est pas définie
la source