SHELL condition
Résolu/Fermé
tlep
Messages postés
596
Date d'inscription
jeudi 21 février 2002
Statut
Membre
Dernière intervention
25 octobre 2012
-
19 mai 2007 à 00:34
tlep Messages postés 596 Date d'inscription jeudi 21 février 2002 Statut Membre Dernière intervention 25 octobre 2012 - 20 mai 2007 à 14:36
tlep Messages postés 596 Date d'inscription jeudi 21 février 2002 Statut Membre Dernière intervention 25 octobre 2012 - 20 mai 2007 à 14:36
A voir également:
- SHELL condition
- Excel cellule couleur si condition texte - Guide
- Classic shell windows 11 - Télécharger - Personnalisation
- Condition et excel - Guide
- Couleur texte avec la fonction si - Forum Excel
- Efi shell version 2.50 - Forum Windows 10
9 réponses
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
19 mai 2007 à 10:52
19 mai 2007 à 10:52
Salut,
$ a=0;b=5;if [ "$a" = 0 -a "b" = 2 -o "$b" = 5 ]; then echo ok;else echo pas ok;fi ok $ a=0;b=5;if [ "$a" = 0 -a "b" = 2 -o "$b" = 3 ]; then echo ok;else echo pas ok;fi pas ok [jp@MDK tmpfs]$:-))
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
19 mai 2007 à 08:59
19 mai 2007 à 08:59
Salut,
if [ test1 ] && ([ test2 ] || [ test3 ])sinon tu peux utiliser la syntaxe
if condition1 then commande1 elif condition2 then commande3 else commande4 fi
tlep
Messages postés
596
Date d'inscription
jeudi 21 février 2002
Statut
Membre
Dernière intervention
25 octobre 2012
118
19 mai 2007 à 12:59
19 mai 2007 à 12:59
Salut, et merci;
Je ne comprends pas du tout ta syntaxe jipicy:
a=0;b=5;if [ "$a" = 0 -a "b" = 2 -o "$b" = 3 ]; then echo ok;else echo pas ok;fi
"b" est toujours égal à "b" non ?
Je ne comprends pas du tout ta syntaxe jipicy:
a=0;b=5;if [ "$a" = 0 -a "b" = 2 -o "$b" = 3 ]; then echo ok;else echo pas ok;fi
"b" est toujours égal à "b" non ?
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
19 mai 2007 à 13:25
19 mai 2007 à 13:25
Oups :-((((
Ereur dans la ligne, il faut lire :
Ereur dans la ligne, il faut lire :
if [ "$a" = 0 -a "$b" = 5 -o "$b" = 3 ]Sorry ;-)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
tlep
Messages postés
596
Date d'inscription
jeudi 21 février 2002
Statut
Membre
Dernière intervention
25 octobre 2012
118
19 mai 2007 à 13:28
19 mai 2007 à 13:28
J'ai un autre souci avec les OU et les ET :
En ligne de commande, si j'exécute :
which monprog 1>/dev/null || (echo "Vous devez préalablement installer monprog." && echo "Fin du script" && exit 1)
Ca marche: j'obtiens
Vous devez préalablement installer monprog.
Fin du script
En revanche dans un shell :
#!/bin/bash
which monprog 1>/dev/null || (echo "Vous devez préalablement installer monprog." && echo "Fin du script" && exit 1)
echo "Suite du script"
Là, les messqges s'affichent mais le script n'exit pas: Suite du script !
Je ne comprends vraiment pas !!!
En ligne de commande, si j'exécute :
which monprog 1>/dev/null || (echo "Vous devez préalablement installer monprog." && echo "Fin du script" && exit 1)
Ca marche: j'obtiens
Vous devez préalablement installer monprog.
Fin du script
En revanche dans un shell :
#!/bin/bash
which monprog 1>/dev/null || (echo "Vous devez préalablement installer monprog." && echo "Fin du script" && exit 1)
echo "Suite du script"
Là, les messqges s'affichent mais le script n'exit pas: Suite du script !
Je ne comprends vraiment pas !!!
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
19 mai 2007 à 13:36
19 mai 2007 à 13:36
Enlève les parenthèses, elles servent à rien.
tlep
Messages postés
596
Date d'inscription
jeudi 21 février 2002
Statut
Membre
Dernière intervention
25 octobre 2012
118
19 mai 2007 à 14:00
19 mai 2007 à 14:00
J'y ai bien pensé, mais dans ce cas (sur la commande ls, installée) :
which ls 1>/dev/null || echo "Vous devez préalablement installer ls." && echo "Fin du script" && exit 1
Dans le script, çà donne :
Fin du script
Bref, il saute le OU, passe au ET, et exit !!!!
which ls 1>/dev/null || echo "Vous devez préalablement installer ls." && echo "Fin du script" && exit 1
Dans le script, çà donne :
Fin du script
Bref, il saute le OU, passe au ET, et exit !!!!
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
19 mai 2007 à 14:09
19 mai 2007 à 14:09
Ben c'est normal.
La commande qui suit "||" n'est exécutée que SI la commande la précédant a renvoyé un code retour différent de "0" (zéro), autrement dit une erreur.
Et là ce n'est précisément pas le cas, étant donné que la commande "ls" a été trouvée... donc on passe au ET (&&).
;-))
La commande qui suit "||" n'est exécutée que SI la commande la précédant a renvoyé un code retour différent de "0" (zéro), autrement dit une erreur.
Et là ce n'est précisément pas le cas, étant donné que la commande "ls" a été trouvée... donc on passe au ET (&&).
;-))
dans
cmd1 || ( cmd2 && exit )
cmd2 et l'exit sont exécutés dans un shell fils (fork) du fait des parenthèses => l'exit ne fait que sortir du processus fils qui de toute façon s'achève avec la parenthèse fermante.
Sans les ( ) l'enchainement est bien celui décrit par jipicy
essaye
cmd1 || {
cmd2
cmd3
exit
}
cmd4
cmd1 || ( cmd2 && exit )
cmd2 et l'exit sont exécutés dans un shell fils (fork) du fait des parenthèses => l'exit ne fait que sortir du processus fils qui de toute façon s'achève avec la parenthèse fermante.
Sans les ( ) l'enchainement est bien celui décrit par jipicy
essaye
cmd1 || {
cmd2
cmd3
exit
}
cmd4
tlep
Messages postés
596
Date d'inscription
jeudi 21 février 2002
Statut
Membre
Dernière intervention
25 octobre 2012
118
20 mai 2007 à 01:05
20 mai 2007 à 01:05
Merci pour tes explications !!
Les accolades fonctionnent effectivement mieux en lieu et place des parenthèses.
En revanche, ce que je ne comprends pas, c'est pourquoi (et surtout quand ??) il faut utiliser des accolades et non des parenthèses ?
Si je mets :
which prog 1>/dev/null || { echo "Vous devez préalablement installer prog." && echo "Fin du script" && exit 1; }
Ca fonctionne.
Et quand je mets :
which prog 1>/dev/null || ( echo "Vous devez préalablement installer prog." && echo "Fin du script" && exit 1; )
on tombe dans un "fork", c.a.d une sorte de "sous-programme" (si j'ai bien compris ?) dont la dernière instruction "exit" ne concerne pas le programme principal ?
Les accolades fonctionnent effectivement mieux en lieu et place des parenthèses.
En revanche, ce que je ne comprends pas, c'est pourquoi (et surtout quand ??) il faut utiliser des accolades et non des parenthèses ?
Si je mets :
which prog 1>/dev/null || { echo "Vous devez préalablement installer prog." && echo "Fin du script" && exit 1; }
Ca fonctionne.
Et quand je mets :
which prog 1>/dev/null || ( echo "Vous devez préalablement installer prog." && echo "Fin du script" && exit 1; )
on tombe dans un "fork", c.a.d une sorte de "sous-programme" (si j'ai bien compris ?) dont la dernière instruction "exit" ne concerne pas le programme principal ?
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
20 mai 2007 à 10:46
20 mai 2007 à 10:46
Re-
Les accolades et les parenthèses permettent le regroupement de commandes.
Comme expliqué par "bipod", avec des accolades, les commandes sont exécutées par le shell courant, alors qu'avec les parenthèses elles sont exécutées par un shell fils (fork).
Le regroupement de commandes sert principalement à :
- rediriger un ensemble de commandes vers (ou depuis) un même fichier
- exécuter un ensemble de commandes en arrière-plan
- conditionner l'exécution d'un ensemble de commandes
Voilà un exemple qui j'espère t'aidera à mieux cerner l'emploi des accolades et des parenthèses :
Les accolades et les parenthèses permettent le regroupement de commandes.
Comme expliqué par "bipod", avec des accolades, les commandes sont exécutées par le shell courant, alors qu'avec les parenthèses elles sont exécutées par un shell fils (fork).
Le regroupement de commandes sert principalement à :
- rediriger un ensemble de commandes vers (ou depuis) un même fichier
- exécuter un ensemble de commandes en arrière-plan
- conditionner l'exécution d'un ensemble de commandes
Voilà un exemple qui j'espère t'aidera à mieux cerner l'emploi des accolades et des parenthèses :
#! /bin/bash echo -e "#############################" echo -e "# Utilisation des accolades #" echo -e "#############################" echo -e "\nRépertoire courant : \c" pwd echo -e "Initialisation de la variable \"v\" :\nv=\"abc\"" v="abc" echo -e "\nDébut de l'environnement avec accolades...\n" { echo -e "Réaffectation de la variable \"v\" :\nv=\"123\"" v="123" echo -e "\nAffichage de la variable \"v\" : \c" echo -e "$v" echo -e "\nChangement de répertoire : " echo -e "cd /tmp" cd /tmp echo -e "\nRépertoire courant : \c" pwd } echo -e "\nFin de l'environnement avec accolades...\n" echo -e "\nRépertoire courant : \c" pwd echo -e "\nAffichage de la variable \"v\" : \c" echo -e "$v" echo unset v cd $HOME echo -e "Appuyez sur une touche pour continuer..." read touche echo -e "###############################" echo -e "# Utilisation des parenthèses #" echo -e "###############################" echo -e "\nRépertoire courant : \c" pwd echo -e "Initialisation de la variable \"v\" :\nv=\"abc\"" v="abc" echo -e "\nDébut de l'environnement avec parenthèses...\n" ( echo -e "Réaffectation de la variable \"v\" :\nv=\"123\"" v="123" echo -e "\nAffichage de la variable \"v\" : \c" echo -e "$v" echo -e "\nChangement de répertoire : " echo -e "cd /tmp" cd /tmp echo -e "\nRépertoire courant : \c" pwd ) echo -e "\nFin de l'environnement avec parenthèses...\n" echo -e "\nRépertoire courant : \c" pwd echo -e "\nAffichage de la variable \"v\" : \c" echo -e "$v" echo exit;-))
tlep
Messages postés
596
Date d'inscription
jeudi 21 février 2002
Statut
Membre
Dernière intervention
25 octobre 2012
118
20 mai 2007 à 14:36
20 mai 2007 à 14:36
Merci, c'est très clair ;-)