2010-05-21 4 views
2

J'ai une fonction bash avec laquelle j'essaie d'utiliser getopts et j'ai des problèmes.L'analyse des getopts dans bash

La fonction est destinée à être appelée par lui-même (getch), avec une option -s drapeau (getch -s), ou avec un argument de chaîne facultatif ensuite (si getch master et getch -s master sont tous les deux valides).

L'extrait ci-dessous est où mon problème est - ce n'est pas la fonction entière, mais c'est ce que je me concentre sur:

getch() 
{ 
    if [ "$#" -gt 2 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then 
    echo "Usage: $0 [-s] [branch-name]" >&2 
    return 1 
    fi 

    while getopts "s" opt; do 
    echo $opt # This line is here to test how many times we go through the loop 
    case $opt in 
     s) 
     squash=true 
     shift 
     ;; 
     *) 
     ;; 
    esac 
    done 
} 

Le getch -s master cas est celui où l'étrangeté se produit. Ci-dessus doivent cracher s une fois, mais à la place, je reçois ceci:

[[email protected]:git-repositories/temp]$ getch -s master 
s 
s 
[[email protected]:git-repositories/temp]$ 

Pourquoi est-il l'analyse syntaxique -s opt deux fois?

+0

Je vais avoir du mal à reproduire ce problème. J'ai copié votre code dans un fichier, et l'ai exécuté avec -s master, -s -s, et toutes les autres choses stupides, et ne peut pas obtenir plus de 1 s à imprimer. –

+0

Désolé, je ne peux pas le reproduire non plus. Ça fonctionne bien pour moi. Changez votre 'echo $ opt' en' echo "Dans getopts: $ opt" 'pour le rendre distinct au cas où quelque chose d'autre le ferait écho. –

+1

Mettez 'OPTIND = 1' avant la boucle getops. '$ OPTIND' est la position dans la liste des paramètres qui doit être analysée par getopts (Lorsque vous avez terminé la boucle while, vous devez faire un' shift $ ((OPTIND-1)) 'pour" décaler "ces paramètres analysés). Si vous omettez de redéfinir OPTIND sur 1, la prochaine fois que vous ferez un getopts dans le shell actuel (ex: une autre fonction), vous analyserez à partir du paramètre $ OPTIND-th, généralement vide, ce qui rendra false et le " alors "sort tout de suite, sans analyser les paramètres. –

Répondre

2

Je ne peux pas reproduire le problème non plus, sur une boîte Ubuntu 10.4 exécutant Bash 4, ou ma boîte MacOSX exécutant Bash 3.2.17.

Votre environnement de shell peut être corrompu par des efforts de débogage antérieurs.

Avez-vous essayé de démarrer avec une nouvelle fenêtre de terminal? Ou démarrez un nouveau shell avec 'exec bash' et réessayez la fonction.

[email protected]:~ $ getch() 
> { 
> if [ "$#" -gt 2 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then 
>  echo "Usage: $0 [-s] [branch-name]" >&2 
>  return 1 
> fi 
> 
> while getopts "s" opt; do 
>  echo $opt # This line is here to test how many times we go through the loop 
>  case $opt in 
>  s) 
>   squash=true 
>   shift 
>   ;; 
>  *) 
>   ;; 
>  esac 
> done 
> } 
[email protected]:~ $ getch -s master 
s 
+0

J'ai essayé de faire un nouveau sous-shell, comme vous l'avez suggéré, et cela a fonctionné. Doit avoir fait quelque chose à mon environnement à l'avance ... En tout cas, merci d'aider! – ABach

+0

Cela arrive de temps en temps. Il est facile de rester bloqué en déboguant un script et d'oublier que votre environnement peut devenir corrompu. –

+0

(en supprimant les commentaires que j'ai mis à tort dans cette réponse au lieu de dans le post du demandeur) –

0

Essayez d'analyser les options en dehors d'une fonction que vous avez écrite. Je me suis amusé un peu plus cet après-midi. J'ai eu du mal à le faire fonctionner correctement lors de l'analyse des options dans une fonction par opposition à juste dans le corps principal du script.

Sinon, je ne sais pas vraiment quoi te dire.