2017-07-21 2 views
0

Je suis relativement nouveau dans ce domaine, et je suis en cours d'exécution de mon script shell nommé « statsrandomrun.sh » avec des extraits de code suivants:Pourquoi getopts dans bash ne donne pas: (par docs) lorsqu'une option manque son argument associé?

#!/bin/bash 
while getopts "m:s:xh" opt; do 
    case $opt in 
    m) 
     MU=$OPTARG; mflag=true; ;; 
    s) 
     SIGMA=$OPTARG; sflag=true; ;; 
    h) 
     usage; exit;; 
    x) 
     xflag=true ;; 
    \?) 
     echo "Invalid option: -$OPTARG" >&2 
     exit 1 
     ;; 
    :) 
     echo "HaHa! Option -$OPTARG requires an argument." >&2 
     exit 1 
     ;; 
    esac 
done 

mais il semble que chaque fois que je passe cette commande

/.statsrandomrun.sh -m 

Je ne vois jamais

echo "HaHa! Option -$OPTARG requires an argument." >&2 
travail

, que je dans l'extrait mis en œuvre ci-dessus. Mon bash me montre juste un autre message:

option requires an argument -- m 

que je n'ai pas évidemment mis dans mon code. En outre, il suit une autre ligne

Invalid option: - 

Je me attends que cela ait lieu, parce que la sortie de help getopts contient les éléments suivants:

Si un argument requis est introuvable, getopts place un « : » dans NOM et définit OPTARG sur le caractère d'option trouvé.

Que se passe-t-il? Des idées? Je vous remercie de toute aide à l'avance :)

+1

Voici quelques ressources. Http://wiki.bash-hackers.org/howto/getopts_tutorial et http://mywiki.wooledge.org/BashFAQ/035?highlight=%28getopts%29. Ces deux sites ont beaucoup de bonnes informations sur les scripts shell. –

+0

Quand je lance votre script: 'script.sh -m' je reçois' script.sh: l'option nécessite un argument - m' et ensuite une ligne en dessous 'Option invalide: -' –

+0

Quelle est la ligne" shebang "dans votre script ? –

Répondre

2

Selon la documentation, qui est help getopts,

getopts: getopts Nom OPTSTRING [arg]

OPTSTRING contient les lettres d'options à reconnaître ; Si une lettre est suivie d'un deux-points, l'option doit avoir un argument, qui doit être séparé de celui-ci par un espace blanc. Getopts signale des erreurs de l'une des deux manières suivantes:

Si le premier caractère de OPTSTRING est deux-points, getopts utilise le rapport d'erreur silencieux. En ce mode, aucun message d'erreur n'est imprimé. ................ Si un argument requis n'est pas trouvé, getopts place un ':' dans NAME et définit OPTARG sur le caractère d'option trouvé. Si getopts n'est pas dans mode silencieux, ........... Si un argument requis n'est pas trouvé, un '?' est placé dans NAME, OPTARG est désactivé et un message de diagnostic est imprimé.

Comme je l'ai mis en œuvre ma fonction getopts en mode non-silence, cet argument manquant après /.statsrandomrun.sh -m déclenché ? être stockés dans $Name (dans mon cas $opt) sans contenu $OPTARG.

Ainsi, ces lignes de code ont été exécutés:

\?) 
    echo "Invalid option: -$OPTARG" >&2 
    exit 1 
    ;; 

qui a produit Invalid option: - avec intégré de diagnostic msg.

Au lieu d'obtenir le résultat que je voulais, je aurais dû utiliser le mode silence comme dans

#!/bin/bash 
while getopts ":m:s:xh" opt; do 
#codes 
done 

en ajoutant deux points précédent dans OPTSTRING.