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 :

Arguments Script Shell


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
    Mai 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 21
    Par défaut Arguments Script Shell
    Bonjour, je suis débutant en Shell, et pour le besoin d'un programme je dois pouvoir récupérer (lire) l'argument suivant de chaque argument de la ligne de commande avant de ne passer puisque celui-ci peut contenir une information supplémentaire qu'il faut prendre en compte.
    Ex: si l'utilisateur rentre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./nom_de_mon programme head "il fait beau" tail
    , alors mon programme doit interpréter "il fait beau" comme étant un argument propre à head, puis d'autre part prendre en compte le troisième argument: tail.

    J'ai essayé plein de fois en parcourant soit la liste d'arguments passés en ligne de commande ($@), soit en bouclant sur le nombre total des arguments ($#) mais en vain.

    Merci d'avance.

    PS: j'ai passé des heures à feuilleter les discussions sur Google qui ne répondent pas à ma question.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 646
    Par défaut
    bonjour,

    tu veux lire les arguments deux par deux ?
    le script n'accepte-t-il que trois arguments ?
    le premier argument (par exemple ici : head) a-t-il toujours un "complément" ?

    on ne peut pas déterminer a priori si un argument est le "complément" du précédent.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 21
    Par défaut
    tu veux lire les arguments deux par deux ?
    Pas forcément puisqu'il y a des arguments (tail) qui n'ont besoin de rien comme spécification derrière.

    le script n'accepte-t-il que trois arguments ?
    Au total, il peut y en avoir 5.

    le premier argument (par exemple ici : head) a-t-il toujours un "complément" ?
    Non, c'est optionnel en effet.

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    il y a une structure assez classique à base de shift pour ce genre de choses qui consiste simplement à consommer les arguments :
    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
    #!/bin/bash
    while (($#)); do
       case "$1" in
          head)
             echo "option \"head\" reconnue, requiert 1 argument : \"$2\""
             shift 2 || break
          ;;
          tail)
             echo "option \"tail\" reconnue, requiert 0 argument."
             shift
          ;;
          "pouet niak")
             echo "option \"pouet niak\" reconnue, requiert 3 arguments : \"$2\", \"$3\" et \"$4\""
             shift 4 || break
          ;;
          *)
             echo "option non-reconnue : \"$1\""
             shift
          ;;
       esac
    done
    et l'output :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ ./script.sh "pouet niak" coincoin prout gruik toto head "bla pouet" tail burp tail "pouet niak" "niarf coin" "slurp"
    option "pouet niak" reconnue, requiert 3 arguments : "coincoin", "prout" et "gruik"
    option non-reconnue : "toto"
    option "head" reconnue, requiert 1 argument : "bla pouet"
    option "tail" reconnue, requiert 0 argument.
    option non-reconnue : "burp"
    option "tail" reconnue, requiert 0 argument.
    option "pouet niak" reconnue, requiert 3 arguments : "niarf coin", "slurp" et ""
    • dès qu'on a plus d'un argument à décaler on s'oblige à une tournure shift x || break, dans le dernier cas par exemple il manque un paramètre pour l'option "pouet niak" et on ne peut décaler que de 3 maximum, shift revient donc avec un code d'erreur, on en profite alors pour sortir de la boucle
    • malgré ça, utiliser $4 ne pose pas de problème, le paramètre est simplement perçu comme vide, il convient donc de faire des checks additionnels si besoin
    • $# représente le nombre d'arguments (restants) sur la ligne de commandes, donc while (($#)) "tant que le nombre de paramètres est différent de 0"

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 21
    Par défaut
    Merci bien à vous BufferBob, j'ai testé et ça marche bien..

    Sauf que j'avais une contrainte supplémentaire: l'option head prend un argument optionnel, donc ne requiert pas forcement d'argument derriere.

    Comment le tester ? Avec un if après le case head?

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 21
    Par défaut
    C'est bon je m'en suis sorti en incluant un if qui teste si l'argument suivant n'est pas tail ou title, et qui le traite avec le head, en shiftant de deux positions, et d'une seule sinon, lorsqu'aucun argument optionne n'est donné.

    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 (($#)); do
        case "$1" in
            head)
                echo "option \"head\" reconnue, requiert 1 argument (optionnel)"
                if [ "$2" = tail ] || [ "$2" = title ]; then
                    echo " --> aucun argument supplémentaire"
                    shift 1 || break
                else
                    echo " --> argument optionnel"
     
                    shift 2 || break #on saute donc l'argument optionnel pour
                    #passer a l'option qui suit
                fi
     
                ;;
            tail)
                echo "option \"tail\" reconnue, requiert 0 argument."
                echo " ---> \"tail \" reconnue "
                shift
                ;;
            title)
                echo "option \"title\" reconnue, requiert 1 argument : \"$2\""
                echo " ---> \"tail \" reconnue, avec argument \"$2\" "
                shift 2 || break
                ;;
            *)
                echo "option non-reconnue : \"$1\""
                shift
                ;;
        esac
        done
    Merci à tous.

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 343
    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 343
    Par défaut
    Bonjour,

    Je te conseillerais de passer par getopts pour gérer tes arguments avec des connecteurs, car l'exemple suivant risque d'être dur à traiter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./monprogramme head tail tail
    Par contre si tu passe par un connecteur, tu pourrais avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./monprogramme -e head tail -e tail
    Au moins ici, la commande n'est pas ambigu...

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 21
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    Je te conseillerais de passer par getopts pour gérer tes arguments avec des connecteurs, car l'exemple suivant risque d'être dur à traiter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./monprogramme head tail tail
    Par contre si tu passe par un connecteur, tu pourrais avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./monprogramme -e head tail -e tail
    Au moins ici, la commande n'est pas ambigu...

    Oui j'ai vu le manuel de la commande getopts mais ce qui me gène c'est qu'il faut mettre des arguments de type -a, -b, et je ne dois pas faire ça normalement, ça complique la tâche.
    Merci.

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

Discussions similaires

  1. script shell et arguments en entrée
    Par Lolitaaa dans le forum Linux
    Réponses: 7
    Dernier message: 03/07/2010, 11h17
  2. Appeller un script shell argumenté
    Par habiba dans le forum Linux
    Réponses: 6
    Dernier message: 03/09/2008, 18h41
  3. Vérification des arguments d'un script(shell)
    Par Info_76 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 18/03/2008, 19h10
  4. Un script shell avec nombre d'argument variable
    Par lastrecrue dans le forum Linux
    Réponses: 1
    Dernier message: 28/05/2006, 11h35
  5. Script shell (argument)
    Par melmouj dans le forum Linux
    Réponses: 2
    Dernier message: 17/01/2006, 16h42

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