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 -h
option (pour l'aide par exemple) et une -a
option 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:h
bit dit "je m'attends à analyser deux options, -a
et -h
, et -a
devrait prendre un argument" (c'est la :
suite a
qui indique à l'analyseur qui -a
prend 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 -world
bit 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 bash
fonction getopts
peut ê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 getopt
et getopt
similaires 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=SIZE
option de [certaines implémentations de] l' du
utilitaire (qui permet également -B SIZE
de 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 dd
et 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' tar
utilitaire a acquis la possibilité de prendre des options avec des tirets plus récemment. Le manuel BSD pour les tar
appels les anciennes options de "drapeaux groupés".