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

Résolu
Swiss Knight Messages postés 1956 Date d'inscription   Statut Membre Dernière intervention   -  
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   -
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 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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   Statut Contributeur Dernière intervention   6 431
 
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   Statut Membre Dernière intervention   110
 
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 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
séparer le test
[[ -n ${MaVar} ]] && if [ ${MaVar} -gt 20 ]; then echo "coucou"; else echo "pas coucou"; fi;
0