Forum Programmation.shell passage d'option

Posté par  .
Étiquettes : aucune
0
1
juil.
2006
Bonjour !
je viens de decouvrir comment passer les options pour un script shell:
donc quand je fais
getopts abc: option
case $option in
a)echo a;;
b)echo b;;
c)echo $OPTARG;;
*)echo pas d'options;;
esac

pas de probleme.
pour pouvoir passer plusieurs options à la suite genre ./toto -ab
je mets tout ça dans une boucle while
mais dans ce cas là, si j'execute le script sans options il ne fait rien... alors qu'avec une ou plusieurs il marche sans probleme

qu'est-ce que je dois faire ?

merci
  • # Re: passage d'option

    Posté par  . Évalué à 3.

    J'imagine que ton script avec une boucle while ressemble à ça:
    while getopts abc: option
    do
        case $option in
            a)echo a;;
            b)echo b;;
            c)echo $OPTARG;;
            *)echo "pas d'options";;
        esac
    done
    
      Si tu ne passes pas d'argument, getopts renvoie faux dès le premier appel et le case n'est jamais exécuté, le message "pas d'options" ne s'affiche donc pas.
      getopts renseigne une variable supplémentaire OPTIND qui permet de savoir combien d'arguements ont été traités. Tu devrais arriver à détecter l'absence d'option en faisant:
    while getopts abc: option
    do
        case $option in
            a)echo a;;
            b)echo b;;
            c)echo $OPTARG;;
        esac
    done
    if [ "$OPTIND" -eq 1 ]
    then
        echo "pas d'option"
    fi
    
    • [^] # Re: passage d'option

      Posté par  . Évalué à 1.

      merci!
      c'est vrai qu'en réfléchissant un peu, ça parait logique...
      mais de toute façon j'ignorais l'existence d'un tel $OPTIND
      • [^] # Re: passage d'option

        Posté par  . Évalué à 2.

        mais de toute façon j'ignorais l'existence d'un tel $OPTIND
        Moi aussi, je l'ignorais mais man getopts m'a mis sur la bonne piste.
        Comme quoi, RTFM ça aide ;)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.