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 :

[SCRIPT] Utilisation de plusieurs commandes CASE imbriquées


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
    Étudiant
    Inscrit en
    Février 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 17
    Par défaut [SCRIPT] Utilisation de plusieurs commandes CASE imbriquées
    Bonjour à toutes et à tous,

    Je suis en train de réaliser un script shell et je rencontre un problème avec l'utilisation de la commande case.

    J'ai eu beau chercher sur le net, je n'ai rien trouvé de concluant, c'est pourquoi je me tourne vers vous.

    Un exemple valant mieux qu'une explication approximative, regardez ci-dessous ce que j'aimerais faire :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    while :
    do
    echo "Choix : $CHOIX"
    echo "Nom :"
    read NOM
     
    echo "Bla bla bla"
     
    echo "Choix :"
    read CHOIX
     
    case $CHOIX in 
     
    1 | 2 )
     
    mes commandes ....
     
    if [[ $CHOIX == "1" ]]
    then
    echo "Rep :"
    read REP
     
    case $REP in
    "o" ) echo "bidule"
    CHOIX=11
    ;;
    "n" ) echo "chouette"
    CHOIX=5
    ;;
    * ) echo "erreur"
    ;;
    esac
     
    else
     
    echo "bye"
    break
    fi
    ;;
     
    3 | 11 )
     
    mes commandes ....
     
    if [[ $CHOIX == "11" ]]
    then
    echo "Rep :"
    read REP
     
    case $REP in
    "o" ) echo "bidule"
    CHOIX=12
    ;;
    "n" ) echo "chouette"
    CHOIX=5
    ;;
    * ) echo "erreur"
    ;;
    esac
     
    else
     
    echo "bye"
    break
    fi
    ;;
     
    4 | 12 )
     
    mes commandes ....
     
    if [[ $CHOIX == "12" ]]
    then
    echo "bye bye"
    break
     
    else
     
    echo "bye"
    break
    fi
    ;;
     
    5 )
     
    echo "Bye"
    break
    ;;
     
    * )
     
    echo "erreur"
    ;;
     
    esac
    done
    Je rencontre donc un problème dans cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    case $REP in
    "o" ) echo "bidule"
    CHOIX=11
    ;;
    "n" ) echo "chouette"
    CHOIX=5
    ;;
    * ) echo "erreur"
    ;;
    esac
    Je rentre bien dans ma boucle if, ainsi que dans mon case donc il prend bien l'entrée clavier et affiche bien le "echo" suivant ce que je saisis au clavier.
    Mon problème se situe précisément au moment où j’attribue une valeur à ma variable CHOIX, pensant que le script va continuer et passer à "l'étape 11".
    Mais ce n'est visiblement pas possible où je m'y prend très mal.

    En fait, ce que fait mon script, c'est qu'il m'affiche le "echo" puis revient directement au début de la boucle while et donc de mon script en me demandant de saisir le "Nom".
    Et surtout, il ne m'affiche pas d'erreur donc la syntaxe ne doit pas être mauvaise.

    J'ai mis un echo "Choix : $CHOIX" au début afin de voir ce qui se passait au moment du passage de la valeur dans la variable, et lorsque c'est une valeur prévue, par exemple 11 ou 5 comme indiqué ci-dessus, la variable CHOIX la prend bien en compte par contre lorsque c'est une autre valeur, la variable CHOIX garde la dernière valeur correct attendue, dans mon cas c'était 1 alors que j'avais saisi 42 au clavier pour REP.

    J'espère que j'ai été assez claire dans mes explications mais si ce n'est pas le cas, n'hésitez pas à me poser vos questions sur les parties qui restent floues.

    Mais je pense, en gros, que vous voyez ce que je veux faire donc si vous pouvez me donner un coup de main (pas un coup de pied ^^) pour résoudre ce problème ou me conseiller, je suis preneur.

    Si vous connaissez une autre méthode pour réaliser ce que je veux faire, n'hésitez pas, je prend aussi.
    En vous remerciant par avance pour vos réponses.

    Bien cordialement,

    Julien.

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

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

    si je résume, tu veux, tant que $CHOIX a une valeur, exécuter CASE $CHOIX, c'est ça ?

    <hs>
    les conditions simples ne requièrent qu'un simple test.
    par convention, les variables ne devraient pas être entièrement en majuscules (les scripts systèmes en ont, mais ce n'est pas la seule erreur qui y est faite).
    </hs>
    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 347
    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 347
    Par défaut
    Bonjour,

    Ton problème est sur le fait que le "case" pour la partie "CHOIX" est déjà calculé, tu ne peux pas la changer en cours de route.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CHOIX=5
    case $CHOIX in
    5 ) CHOIX=6
    ;;
    6 ) CHOIX=7 #ici pour le case, la valeur qui est à vérifier est 5 (et de toute façon, il ne passe pas par là puisque le 1er cas du case est juste)
    ;;
    esac

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    en bash, il est possible de poursuivre (pas reprendre) le déroulement d'un case, avec ;& à la place de ;; :
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ var=3
    $ case $var in
    >    3) var=5 ;&
    >    5) echo $var ;;
    > esac
    5
    il faut absolument que le cas soit après la redéfinition de la variable.
    ça ne me semble pas hyper fiable :/
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    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 347
    Par défaut
    Fonctionne pas terrible à priori:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ CHOIX=3
    $ case $CHOIX in
    > 3 ) CHOIX=4 ;&
    > 5 ) echo $CHOIX
    > ;;
    > esac
    4

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Euh... Ce code fait ce qu'on attend de lui. Non?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 654
    Par défaut
    je n'ai alors pas compris comment ça fonctionne.
    Citation Envoyé par man bash
    Si ;& est utilisé au lieu de ;;, l'exécution continue avec la liste associée au jeu de motifs suivant.
    Si ;;& est utilisé au lieu de ;;, l'interpréteur essaye la liste de motifs suivante, si elle existe, et exécute toute liste associée à un motif correspondant.
    donc, ça ne peut pas s'appliquer ici.
    dans les deux cas, le motif n'est pas rééxaminé, si il est réaffecté.

    EDIT:
    Citation Envoyé par Flodelarab
    Ce code fait ce qu'on attend de lui. Non?
    ça dépend de ce qu'on attend de lui !
    si j'attends qu'il fasse le café, je peux attendre longtemps
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Utilisation de plusieurs boîtes imbriquées
    Par stefsas dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 19/05/2010, 18h21
  2. Utilisation plusieurs boucles For imbriquées
    Par stick25 dans le forum Général VBA
    Réponses: 2
    Dernier message: 07/04/2010, 18h00
  3. utiliser une seule commande pour créer plusieur fichier
    Par waldomania dans le forum Administration système
    Réponses: 1
    Dernier message: 13/12/2009, 16h43
  4. script qui lance plusieurs commandes dos ?
    Par casier dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 13/08/2007, 07h47
  5. Utilisation d'un script en ligne de commande
    Par Thylia dans le forum Langage
    Réponses: 5
    Dernier message: 23/01/2006, 16h28

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