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 :

Choix multiples CASE


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Par défaut Choix multiples CASE
    Bonjour,

    Je suis actuellement en train d'écrire un script en Shell.
    Je dois lister certains services et demander à l'utilisateur de choisir 1 ou plusieurs services. Voici le bout de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    echo " ------------------------------------"
    echo "|   LISTE DES SERVICES DISPONIBLES   |"
    echo " ------------------------------------"
    echo "|      [1] - Service 1               |"
    echo "|      [2] - Service 2               |"
    echo "|      [3] - Service 3               |"
    echo "|      [4] - Service 4               |"
    echo "|      [5] - Service 5               |"
    echo "|      [6] - Service 6               |"
    echo "|      [7] - Service 7               |"
    echo " ------------------------------------"
     
    service1="non"
    service2="non"
    service3="non"
    service4="non"
    service5="non"
    service6="non"
    service7="non"
     
    while true
    do
            read -p "A quel(s) service(s) souhaitez-vous avoir accès ? [n n ...] : " service
            case $service in
                    1 | 1* | *1) service1="oui"
                                 break ;;
                    2 | 2* | *2) service2="oui"
                                 break ;;
                    3 | 3* | *3) service3="oui"
                                 break ;;
                    4 | 4* | *4) service4="oui"
                                 break ;;
                    5 | 5* | *5) service5="oui"
                                 break ;;
                    6 | 6* | *6) service6="oui"
                                 break ;;
                    7 | 7* | *7) service7="oui"
                                 break ;;
                    *) echo "Erreur de saisie : Veuillez choisir les services autorisés."
                       echo "Si vous devez avoir accès à plusieurs services, entrer les numéros séparés par un espace [2 3 6]."
            esac
    done
    Donc ici, je voudrais que si l'utilisateur entre "1", le service1 passe à OUI (ça fonctionne actuellement), si il rentre "3 5 7" les services 3, 5 et 7 passent à OUI (mais là, ça ne fonctionne pas).
    Or, ce code ne fonctionne pas, seul le premier service passe à OUI, si par exemple j'entre 3 2 6, le service 3 passe à OUI le 2 et le 6 restent à NON !

    Auriez-vous une solution à m'apporter ?
    Merci d'avance,
    Malik.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    • mets le read en dehors de la boucle
    • remplace la boucle while par une boucle for pour itérer sur les $service
    • enlève les break


    avec un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/bash
     
    Services=( _no-service_ service1 service2 service3 )
     
    echo "Liste des services"
    for ((i=1;i<${#Services[@]};i++))
    do
       echo "[$i] - ${Services[$i]}"
    done
     
    read -p "Sélection : " sel 
     
    for i in $sel
    do
       echo "start service ${Services[i]}"
    done
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Bonjour,

    Si tu veux garder ta syntaxe (en bash), il suffit d'écrire ton case de la manière suivante par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
            case $service in
                    *1*) service1="oui"
                                 ;;&
                    *2*) service2="oui"
                                 ;;&
                    *3*) service3="oui"
                                 ;;&
                    *4*) service4="oui"
                                 ;;&
                    *5*) service5="oui"
                                 ;;&
                    *6*) service6="oui"
                                 ;;&
                    *7*) service7="oui"
                                 ;;&
                    [^1-7]*) echo "Erreur de saisie : Veuillez choisir les services autorisés."
                       echo "Si vous devez avoir accès à plusieurs services, entrer les numéros séparés par un espace [2 3 6]."
            esac
    Cordialement.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 49
    Par défaut
    Bonjour,

    Merci pour vos solutions !

    N_BaH, votre solution me plait bien, mais le soucis, c'est que derrière, j'ai un petit tableau recap qui m'indique ce genre de chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Acces au Service1 : OUI
    Acces au Service2 : OUI
    ...
    Du coup, là, je ne peux plus avoir ce tableau ?!

    Concernant la solution de disedorgue, j'ai testé aussi, or, pour qu'elle fonctionne, je suis obligé de supprimer la boucle WHILE, cela me gène car je voudrais que si l'utilisateur entre par exemple "128" (sachant qu'il n'existe pas de service 8) la question soit reposé (via la boucle WHILE ici).

    Je cherche toujours une solution me permettant de choisir plusieurs services (de 1 à 7) et si l'utilisateur entre le chiffre 0, 8, 9 ou une lettre), un message d'erreur apparaisse et le script repose la question.

    Merci !

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    j'ai un petit tableau recap [...]
    on n'a peut-être pas la même définition de ce qu'est un tableau pour l'interpréteur de commande.
    s'il ne s'agit que d'afficher des données dans un format tabulaire, tu peux le faire dans la deuxième boucle.
    s'il est question d'un tableau/liste (array), bien que les données soient redondantes, tu peux le remplir dans la deuxième boucle, aussi.
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Ok, pas bien compris le besoin de départ, donc revoici toujours via ta syntaxe de départ (mais il est vrai que pour ma part, je partirais plus comme N_BaH ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    while true
    do
    flag=0
            read -p "A quel(s) service(s) souhaitez-vous avoir accès ? [n n ...] : " service
            for i in $service
            do
                    case $i in
                    1) service1="oui"
                       ;;
                    2) service2="oui"
                       ;;
                    3) service3="oui"
                       ;;
                    4) service4="oui"
                       ;;
                    5) service5="oui"
                       ;;
                    6) service6="oui"
                       ;;
                    7) service7="oui"
                       ;;
                    *) echo "Erreur de saisie : Veuillez choisir les services autorisés."
                       echo "Si vous devez avoir accès à plusieurs services, entrer les numéros séparés par un espace [2 3 6]."
                       flag=1
                       break
                       ;;
            esac
            done
    [ $flag -eq 0 ] && break
     
    done
    Cordialement.

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

Discussions similaires

  1. [MySQL] choix multiple case a coché et insertion dans la base
    Par sooprano dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/03/2010, 16h57
  2. [AC-2007] Choix multiples (case à cocher)
    Par ulrichv dans le forum IHM
    Réponses: 8
    Dernier message: 21/12/2009, 15h02
  3. choix multiples de case puis utilisation
    Par kedal dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 30/05/2008, 10h48
  4. Choix Multiples , case a coché
    Par Mike26 dans le forum IHM
    Réponses: 1
    Dernier message: 02/12/2007, 15h48
  5. Comment creer un choix multiple avec des cases a cocher ??
    Par pedrosystem dans le forum Access
    Réponses: 5
    Dernier message: 09/03/2006, 10h36

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