Lorsque vous écrivez le bit d'analyse de ligne de commande de votre code, vous spécifiez quelles options acceptent les arguments et lesquelles ne le font pas. Par exemple, dans un script shell acceptant une -hoption (pour l'aide par exemple) et une -aoption qui devrait prendre un argument, vous faites
opt_h=0 # default value
opt_a=""
while getopts 'a:h' opt; do
case $opt in
h) opt_h=1 ;;
a) opt_a="$OPTARG" ;;
esac
done
echo "h: $opt_h"
echo "a: $opt_a"
Le a:hbit dit "je m'attends à analyser deux options, -aet -h, et -adevrait prendre un argument" (c'est la :suite aqui indique à l'analyseur qui -aprend un argument).
Par conséquent, il n'y a jamais d'ambiguïté quant à la fin d'une option, au début de sa valeur et au début d'une autre après.
L'exécuter:
$ bash test.sh -h -a hello
h: 1
a: hello
$ bash test.sh -h -ahello
h: 1
a: hello
$ bash test.sh -hahello
h: 1
a: hello
C'est pourquoi la plupart du temps, vous ne devez pas écrire votre propre analyseur de ligne de commande pour analyser les options.
Il n'y a qu'un seul cas dans cet exemple qui est délicat. L'analyse se termine généralement à la première non-option, donc lorsque vous avez des éléments sur la ligne de commande qui ressemblent à des options:
$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello
Ce qui suit résout cela:
$ bash test.sh -a hello -- -world
h: 0
a: hello
Le --signale une fin des options de ligne de commande, et le -worldbit est laissé au programme pour faire ce qu'il veut (c'est dans l'une des variables de position).
C'est d'ailleurs la façon dont vous supprimez un fichier qui a un tiret au début de son nom de fichier avec rm.
MODIFIER :
Les utilitaires écrits en appel C getopt()(déclarés en unistd.h) fonctionnent de la même manière. En fait, pour autant que nous sachions, la bashfonction getoptspeut être mis en œuvre au moyen d' un appel à la fonction de bibliothèque C getopt(). Perl, Python et d'autres langages ont des bibliothèques d'analyse de ligne de commande similaires, et il est très probable qu'ils effectuent leur analyse de manière similaire.
Certaines de ces routines de bibliothèque getoptet getoptsimilaires gèrent également les options "longues". Celles-ci sont généralement précédées de double tiret ( --), et les options longues qui prennent des arguments le font souvent après un signe égal, par exemple l' --block-size=SIZEoption de [certaines implémentations de] l' duutilitaire (qui permet également -B SIZEde spécifier la même chose).
La raison pour laquelle les manuels sont souvent écrits pour montrer un espace entre les options courtes et leurs arguments est probablement pour la lisibilité.
EDIT : les outils vraiment anciens, tels que les utilitaires ddet tar, ont des options sans tirets devant eux. Ceci est purement pour des raisons historiques et pour maintenir la compatibilité avec les logiciels qui dépendent d'eux pour fonctionner exactement de cette façon. L' tarutilitaire a acquis la possibilité de prendre des options avec des tirets plus récemment. Le manuel BSD pour les tarappels les anciennes options de "drapeaux groupés".