[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 -
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 :
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 :
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-
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:
- [Bash] S'arrêter après le 1er test s'il est non rempli ?
- Test performance pc - Guide
- Test disque dur - Télécharger - Informations & Diagnostic
- Test steam deck oled - Guide
- Test composant pc - Guide
- Le document rempli - Guide
4 réponses
Au pire tu fais deux if imbriqués. Moi j'aurais écrit :
En effet :
... donne :
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
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
Salut,
Syntaxe : ${var:?'Message Erreur'}
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. $
Ouais merci, je comprends pas encore tout :
retourne : false
retourne : true
retourne : false
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 :
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.
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-
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-