IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[Bash] mettre plusieurs conditions dans un while


Sujet :

Shell et commandes GNU

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut [Bash] mettre plusieurs conditions dans un while
    Bonjour,

    J'essaie de faire un script Bash dans lequel j'ai une boucle while. J'aimerai mettre plusieurs conditions séparé par des "ET" ou des "OU".

    J'ai tester plusieur syntaxe mais aucune est la bonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while [ condition1 -eq condition 2 && condition3 -eq condition4 ]; do
    ...
    done
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while [ condition1 -eq condition 2 || condition3 -eq condition4 ]; do
    ...
    done
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while [ condition1 -eq condition 2 AND condition3 -eq condition4 ]; do
    ...
    done
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while [ condition1 -eq condition 2 OR condition3 -eq condition4 ]; do
    ...
    done
    De plus j'aimerai savoir si on peut faire des Do While ? (j'aimerai faire un système tant que la personne n'a pas répondu la bonne réponse, on lui la reponse > voulez vous continiez ? (o/n) : )

    Merci d'avance

    Arnaud

  2. #2
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    T'y étais presque

    Je viens de tester, et en fait il suffit de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while [ condition1 -eq condition 2 ] && [ condition3 -eq condition4 ]; do
    ...
    done
    ++

  3. #3
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par arnaudperfect
    De plus j'aimerai savoir si on peut faire des Do While ? (j'aimerai faire un système tant que la personne n'a pas répondu la bonne réponse, on lui la reponse > voulez vous continiez ? (o/n) : )

    L'utilisation des double-crochets est recommandée dans tous les cas de test.
    Si la variable testée, en l'occurence $choice, est vide il n'y aura pas d'erreur de syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    choice=""
    while [[ $choice != "o" && $choice != "n" ]] ; do
    	echo "(o|n) ??"
    	read choice
    done
    Exemple d'utilisation de simples crochets et que la varable est vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    choice=""
    while [ $choice != "o" ] && [ $choice != "n" ] ; do
    	echo "(o|n) ??"
    	read choice
    done
    
    ./xawk27.sh: line 2: [: !=: unary operator expected

    Oblige à encadrer les variable de double-quotes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    choice=""
    while [ "$choice" != "o" ] && [ "$choice" != "n" ] ; do
    	echo "(o|n) ??"
    	read choice
    done

  4. #4
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Bonjour

    Citation Envoyé par BlaireauOne
    L'utilisation des double-crochets est recommandée dans tous les cas de test.
    ...a la différence que [[ est une extension de certains shell qui fais que le script est lié à un shell "exotique" (ne pas oublier de modifier le she-bang en fonction, par exemple #!/usr/bin/env bash).

    Citation Envoyé par BlaireauOne
    Si la variable testée, en l'occurence $choice, est vide il n'y aura pas d'erreur de syntaxe
    Il suffit d'être rigoureux comme tu le précise ensuite... De manière générale, toute référence à une variable de type string devrait se faire entre double quotes .

    Bon dev'

  5. #5
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Citation Envoyé par arnaudperfect
    J'essaie de faire un script Bash dans lequel j'ai une boucle while. J'aimerai mettre plusieurs conditions séparé par des "ET" ou des "OU".
    je te conseille de lire man test (ou man [). Ce que tu cherchais, c'était les options -a (and) et -o (or).

    Bien sûr, il est possible de passer par le shell comme ça a été dit. Mais le binaire (ou plus souvent builtin) [ est capable de gérer les opérateurs logiques tout seul.

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    et niveau portabilité, c'est mieux des -a ou les crochets ?

  7. #7
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Citation Envoyé par arnaudperfect
    et niveau portabilité, c'est mieux des -a ou les crochets ?
    Ca change rien. Ce qui change c'est le nombre de programes exécutés. Généralement moins y en a, mieux c'est

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    ok merci, je vais essayer ca dans mon script ! merci beaucoup de vos lumières !

  9. #9
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    ok ça fonctionne pour les || ou && dans les conditions, mais dans le script que j'essaie de faire (je ne sais pas si c'est très bon se que je fais) :

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #Vérifier que le user est pas égale à root" et si le user n'existe pas dans le système
     
    user="root"
    while [ $user = "root" ] || [ grep -q $user /etc/passwd ]; do
      #Demande à l'administrateur d'entrer un Nom et Prénom
      read -p "Entrez un Nom : " nom
      read -p "Entrez un Prénom : " prenom
      #Extraire la 1er lettre du prénom
      prenom=${prenom:0:1}
      #Créer une variable user composées de la 1er lettre du prénom et le nom > création du nom du user
      user=$premon$nom
    done

    bah j'ai une erreur. J'entre bien dans la boucle, j'entre les données, le nom du user est créer, mais si jamais je créer un user "root" ou un user existant, ca plante au niveau de mes tests...

  10. #10
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Citation Envoyé par arnaudperfect
    [CODE=bash]while [ $user = "root" ] || [ grep -q $user /etc/passwd ]; do
    [ est un programme, tout comme grep... donc les mettre comme ça cote à cote ne veux rien dire... c'est comme faire "ls cd dossier".

    Tu voulais tapper quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while [ "$user" = "root" ] || grep -q $user /etc/passwd; do
    (les quotes ... on en a parlé plus haut... indispensable avec [)

  11. #11
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    Ah ok d'accord ! je débute en bash, ca ne fais que depuis vendredi que je m'y interesse . Je comprend mon erreur !

    Sinon j'ai testé et ca fonctionne nickel, ainci que mon test de o/n.

    Merci encore de votre aide !

  12. #12
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    967
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 967
    Points : 1 410
    Points
    1 410
    Par défaut
    Pareil pour le grep, il faut les quotes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -q "$user" /etc/passwd

  13. #13
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Citation Envoyé par LLB
    Pareil pour le grep, il faut les quotes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -q "$user" /etc/passwd
    Bien vu

  14. #14
    Membre actif
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2006
    Messages
    1 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 080
    Points : 287
    Points
    287
    Par défaut
    ok merci, comme ça j'aurai un code nickel !

    merci pour vos remarques et conseils !

    Maintenant j'ai un autre souci, je n'arrive pas à passer des paramètres à la fonction "useradd". j'ai aussi un soucie avec la fonction "passwd", je ne sais même pas si se que j'essaie de faire est possible Mais je vais ouvrir un autre post vu que c'est un problème différent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Plusieurs conditions dans un while/wend, possible?
    Par rsoul dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/06/2008, 15h10
  2. plusieurs condition dans un while
    Par realkilla dans le forum C#
    Réponses: 4
    Dernier message: 17/05/2008, 16h16
  3. Plusieurs conditions dans un while
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 29
    Dernier message: 11/01/2008, 17h44
  4. Plusieur Condition dans REquette UPDATE
    Par ducseb dans le forum Langage SQL
    Réponses: 12
    Dernier message: 11/08/2005, 11h46
  5. mettre plusieurs chose dans le onclick
    Par donny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 01/06/2005, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo