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

Résolu
Swiss Knight Messages postés 2257 Statut Membre -  
dubcek Messages postés 18627 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-

4 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  3. Swiss Knight Messages postés 2257 Statut Membre 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
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    séparer le test
    [[ -n ${MaVar} ]] && if [ ${MaVar} -gt 20 ]; then echo "coucou"; else echo "pas coucou"; fi;
    
    0