-
Notifications
You must be signed in to change notification settings - Fork 16
/
getopts_getopt.txt
180 lines (165 loc) · 9.4 KB
/
getopts_getopt.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
GETOPTS_GETOPT
getopts STRING VAR #Extrait la énième option de STRINGZ (par défaut "$@"),
[STRINGZ...] #où N = OPTIND - 1, et seulement si le caractère suivant
#le tiret de cette option est l'un des caractères de
#STRING (sinon il s'agit d'une invalid option, voir plus
#bas), et l'enregistre (sans tiret) dans VAR.
#Cependant, si le caractère matché dans STRING est
#suivi de :, l'option devra être suivie d'un
#argument, qui sera enregistré dans OPTARG (sinon elle
#produit une erreur, voir plus bas)
#Incrémente ensuite OPTIND
#STRINGZ doit être :
# - sous la forme "STRINGZ1" "STRINGZ2" ... (comme pour
# "$@")
# - une array, sous la forme "${ARR[@]}"
#Renvoie false si l'argument ne commence pas par un
#tiret ou s'il est juste un tiret
# - while getopts ...
#est donc possible, et arrêtera la procession des
#arguments à la première opérande
#
TERMINOLOGIE ==> #Voir la doc pour la terminologie.
#
LONG OPTIONS ==> #getopts ne reconnaît que les short options
VARIABLES UTILISEES #getopts utilise quelques variables :
#
OPTIND #Index utilisé par getopts pour savoir quel option
#analyser. S'incrémente de 1 à chaque getopts. Dans le
#cas d'une option du style -CHAR1CHAR2...,
#l'incrémentation a lieu pour le dernier CHAR
#Initialisée à 1 au début de tout shell. La
#réinitialiser à 1 si nouvelle invocation d'une boucle
#while getopts ...
#Faire un shift $(( OPTIND -1 )) après une boucle while
#getopts ... supprime les options.
OPTARG #Enregistre l'argument d'une option demandant un
#argument supplémentaire
OPTERR #Si affectée à 0, getopts ne produit pas de message
#d'erreurs en mode verbose. Initialisée à 1 au début de
#tout shell.
SILENT ET VERBOSE #Si STRING commence par :, il tourne en silent mode,
MODES ==> #sinon il tourne en verbose mode. Les différences sont :
#
# ERREUR | VERBOSE | SILENT
# | |
# Invalid | VAR = ? | VAR = ?
# option | OPTARG = "" | OPTARG = l'invalid
# | Un message d'erreur | option
# | est affiché |
# Required | VAR = ? | VAR = :
# argument | OPTARG = "" | OPTARG = l'option
# missing | Un message d'erreur | dont il manque un
# | est affiché | argument
#
#Préférer le silent mode
ITERATION DE LA MEME #Il est possible d'itérer une option. Prévoir un
OPTION ==> #"switch" dans les commandes déclenchées par l'option
#pour éviter cela si l'on veut l'éviter
OPTIND=1
while getopts ":ab:c"
opt ; do
case $opt in
a)
COMMANDES1 ;;
b)
COMMANDES2 ;;
c)
COMMANDES3 ;;
\?)
ERREUR1 >&2
exit ;;
:)
ERREUR2 >&2
exit ;;
esac
done #Exemple d'implémentation. OPTARG peut être utilisé pour
shift $(( OPTIND - 1 )) #COMMANDES3, ERREUR1 et ERREUR2.
GETOPT VS GETOPTS ==> #Getopts est un builtin, getopts une commande externe,
#et getopts est à préférer car plus simple et performant
#Cependant, seul getopt permet d'utiliser des long-
#options
getopt OPTION... #Comprend STRING... comme une liste d'arguments séparés
-- [STRING]... #par des espaces non échappés (utiliser donc "$@" pour
#STRING). STRING peut être nul (nul par défaut).
#
EFFET ==> #Imprime :
# - la liste des options spécifiées dans STRING,
# séparées les unes des autres par une newline. Ces
# options sont imprimées au format :
# - -CHAR pour les short options
# - --STRING pour les long options
# - -STRING pour les long alternate options (-a
# doit être activé)
#Si une option a un argument, celui-ci lui succède,
#avec une newline entre les deux.
# - la string "--" suivie d'une newline
# - la liste des opérandes (voir doc) spécifiées dans
# STRING, séparées les unes des autres par une
# newline.
#
OPTION ==> #OPTION sert à indiquer les options à reconnaître. Le
#format est :
# - pour les short options, -o CHAR... ou --options
# CHAR..., où chaque CHAR représente une short
# option, sans son tiret. Si CHAR est suivi d'un :,
# un argument est requis (il doit suivre l'option
# avec ou sans whitespace). Si CHAR est suivi de ::,
# un argument est optionnel (il doit suivre l'option
# sans whitespace). Si le premier CHAR est :,
# active l'option -q
# - pour les long options, -l (ou --longoptions)
# STRING[,STRING]... où chaque STRING représente une
# long option, sans ses tirets. Même chose pour :
# et ::, sauf qu'une option requise peut être
# séparée par un = et non un whitespace. Une longue
# option peut être abrégée dans STRING, du moment
# qu'il n'y a pas ambiguïté.
#
TRAITEMENT DES #Si une option n'est pas reconnue, ou si une option n'a
ERREURS ==> #pas l'argument qu'elle requiert, une erreur s'affiche,
#et l'option en question n'est pas imprimée.
#
ATTENTION ==> # - Les arguments contenant un espace échappé sont
# imprimés entourés de simples guillemets. Ces
# guillemets étant eux-mêmes échappés pour être
# imprimés, il faut donc utiliser eval sur le
# résultat de l'impression pour avoir quelque chose
# d'utilisable
# - Il faut qu'il y ait au moins une short option,
# sinon ça bugue.
# - De plus, si un option facultative n'est pas
# donnée, une newline est tout de même imprimée
# - Si le premier argument de getopt ne commence pas
# par un tiret, il est considéré comme l'argument
# d'un -- options implicite, et --unquoted est activé
-a #Permet aux STRING contenant une long-option avec un
--alternative #seul tiret de matcher malgré tout les long-options
#spécifiées
-n STRING #Affiche STRING plutôt que getopts dans les messages
--name STRING #d'erreur. Faire donc -n $(basename $0)
-u
--unquoted #N'imprime pas les simples guillemets cités plus haut.
-q
--quiet #N'imprime pas d'erreur (stderr)
-Q
--quiet-ouput #N'imprime pas d'output (stdout)
#Exemple d'utilisation :
eval set -- $(getopt -n $(basename $0) -l longopt,longdeu -o la:c -- "$@")
while [[ $1 != "--" ]] ; do
case "$1" in
-a)
COMMANDES avec "$2"
shift ;;
-c)
COMMANDES ;;
--longopt|-l)
COMMANDES ;;
--longdeu)
COMMANDES ;;
esac
shift
done
shift