[Bash] S'arrêter après le 1er test s'il est non rempli ?

Résolu/Fermé
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 - Modifié par Swiss Knight le 20/04/2013 à 13:45
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 20 avril 2013 à 14:29
Bonjour tout le monde.

J'ai un petit souci en bash lorsqu'une variable n'est pas définie (erreur : -gt opérateur unaire attendu) avec cette expression :
if [ ${MaVar} -gt 20 ]; then echo "coucou"; else echo "pas coucou"; fi;


Lorsque $MaVar vaut quelque chose, ça marche, mais si la variable ne vaut rien, i.e. est vide, ça me met le message d'erreur ci-dessus parce qu'il n'arrive pas à évaluer l'expression -gt, ce qui est logique puisqu'elle vaut "rien".

Donc j'ai rajouté une première condition :
if [ -n ${MaVar} ] && [ ${MaVar} -gt 20 ]; then echo "coucou"; else echo "pas coucou"; fi;


En vérifiant si $MaVar est non nulle d'abord...
Mais l'erreur est toujours là, il a donc évalué toutes les conditions du if !
Or, j'aurai aimé qu'il s'arrête après la 1ère si elle n'est pas vérifiée !

Il me semblait qu'en mettant un seul & au lieu de deux && ça permettait de faire ça. Mais même avec un &, l'erreur est toujours présente.

Qu'est-ce que je peux faire, pour que dans le cas où $MaVar n'est pas définie, il s'arrête, n'évalue pas les conditions qui suivent, et passe directement au else ?


Un très grand merci pour votre aide !
Bonne journée.
"Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement." -A. Einsten-
A voir également:

4 réponses

mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 7 751
20 avril 2013 à 13:52
Au pire tu fais deux if imbriqués. Moi j'aurais écrit :

if [ "${MaVar}" ] && [ "${MaVar}" -gt 20 ]
then
    echo "true"
else
    echo "false"
fi


En effet :

if [ "${MaVar}" ] && [ "${MaVar}" -gt 20 ]
then
    echo "1) true"
else
    echo "1) false"
fi

MaVar=22

if [ "${MaVar}" ] && [ "${MaVar}" -gt 20 ]
then
    echo "2) true"
else
    echo "2) false"
fi

MaVar=12

if [ "${MaVar}" ] && [ "${MaVar}" -gt 20 ]
then
    echo "3) true"
else
    echo "3) false"
fi


... donne :

1) false
2) true
3) false


Ceci dit, si tu initialises MaVar avec une chaîne qui n'est pas une valeur numérique, ça ne va pas marcher. Mais dans ce cas tu es obligé de faire un test.
https://stackoverflow.com/questions/309745/check-that-a-variable-is-a-number-in-unix-shell

Bonne chance
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
20 avril 2013 à 14:05
Salut,

Syntaxe : ${var:?'Message Erreur'}

$ MaVar="22"

$ if [ ${MaVar:?'Attention ! Variable non définie.' } -gt 20 ]; then echo "coucou"; else echo "pas coucou"; fi
coucou

$ MaVar="2"

$ if [ ${MaVar:?'Attention ! Variable non définie.' } -gt 20 ]; then echo "coucou"; else echo "pas coucou"; fi
pas coucou

$ unset MaVar

$ if [ ${MaVar:?'Attention ! Variable non définie.' } -gt 20 ]; then echo "coucou"; else echo "pas coucou"; fi
bash: MaVar: Attention ! Variable non définie. 

$

0
Swiss Knight Messages postés 1956 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 27 juillet 2016 110
Modifié par Swiss Knight le 20/04/2013 à 15:06
Ouais merci, je comprends pas encore tout :

if [ -n "${MaVar}" ]; then echo "true"; else echo "false"; fi

retourne : false

if [ -n ${MaVar} ]; then echo "true"; else echo "false"; fi

retourne : true

if [ "${MaVar}" ]; then echo "true"; else echo "false"; fi

retourne : false

if [ ${MaVar} ]; then echo "true"; else echo "false"; fi

retourne : false

Les guillemets jouent donc un rôle non négligeables mais je ne comprends pas bien pourquoi ; ma variable existe mais est vide. :S


Je me suis trompé avant aussi ; j'ai interverti le comportement entre un et deux signes &

Le double && permet de court-circuiter le test si la première condition n'est pas vérifiée justement, donc moi il me la vérifiait alors que je pensais qu'elle ne l'était pas.
J'utilisais le -n sans les guillemets, donc il me retourne true ci-dessus ! Et pas de bol; c'est la seule des quatre où true est retourné. Les trois autres fonctionnent. Et au passage j'ai découvert l'utilisation des doubles crochets : [[ comme ceci :

if [[ -n ${MaVar} && $ {MaVar} -gt 20 ]]; then echo "true"; else echo "false"; fi;

qui me retourne : false aussi !
Donc ici, je ne sais pas pourquoi, mais sans les guillemets avec le test -n, ça marche sans erreur tandis que séparés par de simples crochets, ces deux tests me retournent une erreur. Incompréhensible pour moi.

if [ -n ${MaVar} ] && [ ${MaVar} -gt 20 ]; then echo "true"; else echo "false"; fi;

qui me retournait donc : false + l'erreur

Merci !
"Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement." -A. Einsten-
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
20 avril 2013 à 14:29
hello
séparer le test
[[ -n ${MaVar} ]] && if [ ${MaVar} -gt 20 ]; then echo "coucou"; else echo "pas coucou"; fi;
0