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?
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. –
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. –
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. –