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

Linux Discussion :

Script shell case esac


Sujet :

Linux

  1. #1
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut Script shell case esac
    Bonjour

    Je souhaite développer un petit script shell mais je ne me souviens plus de grand chose

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    echo -n "(U)pdate or (S)hell? "
    read answer
     
    case $answer in
         U|u)
              echo "Update"
              ;;
         S|s)
              echo "Shell"
              ;;
            *)
              ;;
    esac
    Je souhaiterai que la question soit reposée à chaque fois que l'utilisateur saisisse autre chose que U|u ou S|s. Auriez-vous un exemple s'il vous plaît ?

    Merci
    .Olivier

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Olivier Regnier Voir le message
    Bonjour

    Je souhaite développer un petit script shell mais je ne me souviens plus de grand chose

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    echo -n "(U)pdate or (S)hell? "
    read answer
     
    case $answer in
         U|u)
              echo "Update"
              ;;
         S|s)
              echo "Shell"
              ;;
            *)
              ;;
    esac
    Je souhaiterai que la question soit reposée à chaque fois que l'utilisateur saisisse autre chose que U|u ou S|s. Auriez-vous un exemple s'il vous plaît ?
    T'as vraiment osé ??? Pfff...

    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
    while true
    do
        echo -n "(U)pdate or (S)hell? "
        read answer
     
        case $answer in
             U|u)
                  echo "Update"
                  break
                  ;;
             S|s)
                  echo "Shell"
                  break
                  ;;
              *)
                   echo "Bad réponse - Try again"
     
        esac
    done
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Il m'arrive parfois de plus me rappeler tel ou tel chose surtout lorsque tu développes avec plusieurs langages. Dans ce cas, je fais appel à mes amis sur Developpez

    En tout cas, merci beaucoup, le code fonctionne
    .Olivier

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Olivier Regnier Voir le message
    Il m'arrive parfois de plus me rappeler tel ou tel chose surtout lorsque tu développes avec plusieurs langages. Dans ce cas, je fais appel à mes amis sur Developpez
    A mon avis, dans n'importe quel langage structuré l'algo sera le même
    - boucle infinie
    - sortie de boucle sur réponse correcte
    C'est pas très académique (surtout face à ceux qui prônent la rigueur) mais c'est ce qu'il y a de plus simple à écrire...

    Citation Envoyé par Olivier Regnier Voir le message
    En tout cas, merci beaucoup, le code fonctionne
    Etonnant...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    je plaisantais

    Dit-moi si, je veux poser plusieurs questions, quelle est la meilleure solution de codage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while true
    do
         echo -n "(U)pdate or (S)hell? "
         read answer
         case $answer in
                U|u)
                     while true
                     do
                     echo -n "Deuxième question"
                     etc ...
    Est-ce une bonne solution de procéder ainsi ?

    Merci
    .Olivier

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Olivier Regnier Voir le message
    je plaisantais

    Dit-moi si, je veux poser plusieurs questions, quelle est la meilleure solution de codage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while true
    do
         echo -n "(U)pdate or (S)hell? "
         read answer
         case $answer in
                U|u)
                     while true
                     do
                     echo -n "Deuxième question"
                     etc ...
    Est-ce une bonne solution de procéder ainsi ?

    Merci
    Je ne crois pas car cela va te forcer à répéter la seconde question dans toutes les valeurs du case. Et si t'as une 3° question ???

    Moi je verrais bien une variable qui s'allonge

    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
    unset rep
    # Question 1
    while true
    do
         echo -n "(U)pdate or (S)hell? "
         read answer
         case $answer in
                U|u)
                      rep="${rep}U"
                      break;
                      ;;
                S|s)
                      rep="${rep}S"
                      break;
                      ;;
               *)
                     echo "bad"
          esac
    done
     
    # Question 2
    while true
    do
         echo -n "(R)emove or (P)ython? "
         read answer
         case $answer in
                R|r)
                      rep="${rep}R"
                      break;
                      ;;
                P|p)
                      rep="${rep}P"
                      break;
                      ;;
               *)
                     echo "bad"
          esac
    done
     
    # Question 3
    ... etc ...
     
    # Question 4
    ... etc ...
     
    # Traitement des réponses
    echo $rep
    Ou alors une fonction beaucoup plus générique dédiée à poser la question et stocker la réponse selon les paramètres qu'on lui passe

    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
    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
    # Fonction pour poser une question
    # Nb arguments: au-moins 2
    # Argument 1: question
    # Argument 2 et suivants: réponses autorisées
    ask()
    {
        local answer
        local q=$1; shift
        local arg
     
        while true
        do
           echo -n "$q ?"
           read answer
           for arg in $*
           do
                if test "`echo $answer |tr '[:lower:]' '[:upper:]'`" = "$arg"
                then
                      rep="$rep$arg"
                      break 2     # ou bien return
               fi
            done
     
            echo "Mauvaise réponse"
        done
    }
     
    unset rep
     
    # Question 1
    ask "(U)pdate or (S)hell" U S
     
    # Question 2
    ask "(R)emove or (P)ython" R P
     
    # Question 3
    ask "(T)ata or (Y)oyo" T Y
     
    # Question 4
    ask "(H)urlu or (B)erlu" H B
     
    # Traitement
    echo $rep
    Bon j'ai tapé ce code en live sans tester (j'ai pas de linux sous la main) mais je sens que ça peut le faire (testerai demain au bureau)...

    [EDIT]J'ai testé et ça marche nickel. Sauf que ce code utilise une variable "$rep" dans et hors des fonctions et ce n'est pas une bonne chose (il n'y a pas indépendance des noms)

    J'en ai écrit un autre un peu plus simple

    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
    #!/bin/sh
     
    # Fonction pour poser une question
    # Nb arguments: au-moins 2
    # Argument 1: question
    # Argument 2 et suivants: choix offerts
    ask()
    {
    	# Création d'un sous-shell pour isoler le contexte
    	(
    		# Mémorisation des choix
    		choix=$*
     
    		# Création du prompt
    		PS3="$1"; shift
    		for arg in $*
    		do
    			PS3="$PS3 or $arg"
    		done
    		PS3="$PS3 ? "
     
    		# Affichage des choix
    		select rep in $choix
    		do
    			test -n "$rep" && return $REPLY
    			echo "Mauvaise réponse"
    		done
    	)
     
    	# On renvoie le code retour venant du sous-shell (le REPLY en fait)
    	return $?
    }
     
    unset rep
     
    # Question 1
    ask Update Shell
    rep=$rep$?
     
    # Question 2
    ask Remove Python
    rep=$rep$?
     
    # Question 3
    ask Tata Yoyo Tito
    rep=$rep$?
     
    # Question 4
    ask Hurlu Berlu
    rep=$rep$?
     
    # Traitement
    echo $rep
    Là, les noms des variables de la fonction sont indépendants des variables du corps principal
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Elles sont superbes ces explications. Il faut garder ce post dans un coin.

    Merci beaucoup
    .Olivier

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Olivier Regnier Voir le message
    Elles sont superbes ces explications.
    Y avait longtemps !!!

    Citation Envoyé par Olivier Regnier Voir le message
    Il faut garder ce post dans un coin.
    Non, faut juste que tu comprennes la conception et ensuite tu seras capable de le refaire tout seul...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. Problème avec mon script shell case in esac
    Par Olivier Regnier dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 28/06/2007, 22h54
  2. [JSP] script shell
    Par goolix dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 06/08/2004, 09h08
  3. Exécution d'un script shell
    Par Manu0086 dans le forum Linux
    Réponses: 8
    Dernier message: 15/06/2004, 16h31
  4. Explication script shell
    Par crasho007 dans le forum Linux
    Réponses: 2
    Dernier message: 14/06/2004, 13h54
  5. Cron + terminal + script shell
    Par nicolas.pissard dans le forum Linux
    Réponses: 3
    Dernier message: 17/03/2004, 09h24

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