getopt(3C) getopt(3C)
NAME
getopt, optarg, optind, opterr, optopt - Optionsbuchstaben aus Argu-
mentvektor abfragen
SYNTAX
#include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
BESCHREIBUNG
getopt() gibt den nächsten Optionsbuchstaben in argv zurück, der einem
Buchstaben in optstring entspricht. Es unterstützt alle Regeln der
Norm für die Kommandosyntax. Da alle neuen Kommandos der Kommando-
syntax-Norm folgen sollen, sollten Sie getopt(1), getopt(3C) oder
getsubopt(3C) zur Analyse der Positionsparameter und zur Prüfung auf
Optionen verwenden, die für das entsprechende Kommando zulässig sind.
optstring muß die Optionsbuchstaben enthalten, die vom Kommando
erkannt werden, das getopt() verwendet; wenn hinter einem Buchstaben
ein Doppelpunkt folgt, wird erwartet, daß die Option ein Argument oder
eine Gruppe von Argumenten hat, die durch ein Leerzeichen von der
Option getrennt sein können. optarg wird so gesetzt, daß es bei der
Rückkehr von getopt() auf den Anfang des Optionsarguments weist.
getopt() setzt den argv-Index des nächsten zu verarbeitenden Arguments
in optind. optind ist extern und wird vor dem ersten Aufruf von
getopt() auf 1 initialisiert. Argumente, die Leerzeichen enthalten
sollen, müssen in Anführungszeichen stehen.
Nach Verarbeitung aller Optionen (d. h. bis zum ersten Argument, das
keine Option ist) gibt getopt() EOF zurück. Zur Begrenzung des Endes
der Optionen kann die Sonderoption -- (zwei Bindestriche) verwendet
werden; wird diese angetroffen, erfolgt die Rückgabe von EOF, und --
wird übersprungen. Das ist sinnvoll, um Argumente zu bestimmen, die
keine Optionen sind und mit - (Bindestrich) beginnen.
BEISPIELE
Der nachstehende Code-Ausschnitt zeigt, wie man die Argumente für ein
Kommando verarbeiten kann, das die sich gegenseitig ausschließenden
Optionen a und b sowie die Option o annehmen kann, die ein Optionsar-
gument erfordert:
#include <unistd.h>
int
main (int argc, char *argv[])
{
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
getopt(3C) getopt(3C)
int c;
extern char *optarg;
extern int optind, optopt;
int aflg, bflg, errflg;
char *ofile;
char *ifile;
while ((c = getopt(argc, argv, ":abf:o:")) != -1) {
switch (c) {
case 'a':
if (bflg)
errflg++;
else
aflg++;
break;
case 'b':
if (aflg)
errflg++;
else {
bflg++;
bproc();
}
break;
case 'f':
ifile = optarg;
break;
case 'o':
ofile = optarg;
break;
case ':': /* -f oder -o ohne Operand */
fprintf(stderr,Option -%c benötigt einen
Operanden\n, optopt);
errflg++;
break;
case '?':
fprintf(stderr,
Unbekannte Option: -%c\n, optiot);
errflg++;
}
}
if (errflg) {
fprintf(stderr,
"Gebrauch: ...");
exit (2);
}
for ( ; optind < argc; optind++) {
if (access (argv[optind], ROK)) {
...
}
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
getopt(3C) getopt(3C)
Folgende Eingaben werden als äquivalent erkannt:
cmd -ao arg pfad pfad
cmd -a -o arg pfad pfad
cmd -o arg -a pfad pfad
cmd -a -o arg -- pfad pfad
cmd -a -oarg pfad pfad
cmd -aoarg pfad pfad
ERGEBNIS
getopt() gibt eine Fehlermeldung auf der Standardfehlerausgabe aus und
gibt ein ? (Fragezeichen) zurück, wenn es einen Optionsbuchstaben
antrifft, der in optstring nicht enthalten ist, oder wenn es kein
Argument nach einer Option findet, die ein Argument erwartet. Wenn das
erste Zeichen in optstring ein Doppelpunkt : war, gibt getopt() bei
einem fehlenden Argument einen : (Doppelpunkt) zurück. Die Fehlermel-
dung kann durch Setzen von opterr auf 0 abgeschaltet werden. Der Wert
des Zeichens, das den Fehler verursachte, ist in optopt.
HINWEISE
Die Funktion getopt() überprüft nicht vollständig auf notwendige Argu-
mente. Wenn zum Beispiel eine Optionszeichenkette a:b und die Eingabe
-a -b gegeben sind, nimmt getopt() an, daß -b das notwendige Argument
für die Option -a ist, und nicht, daß ein notwendiges Argument für -a
fehlt.
Wenn ein "?" (Fragezeichen) als Option gewünscht ist, muß opterr auf 0
gesetzt und der Wert des Zeichens optopt abgefragt werden. Wenn ein
"?" enthalten ist, wurde "?" als Option angegeben. Andernfalls wurde
eine unbekannte Option verwendet, oder es wurde kein Argument für eine
Option angegeben, wo eins erwartet wurde. Die Fehlermeldungsbehandlung
muß das Programm selber durchführen. Obwohl die getopt()-Funktion es
erlaubt, sollte das "?" nicht als Option verwendet werden.
Es ist eine Verletzung der Kommandosyntax-Norm für Optionen, wenn meh-
rere Optionen zusammengefaßt werden und die letzte davon ein Argument
benötigt. Das Kommando cmd -aboxxx Datei, bei dem a und b normale
Optionen sind und die Option o das Argument xxx benötigt, ist ein Bei-
spiel dafür. Obwohl diese Syntax in der aktuellen Implementierung
erlaubt ist, sollte sie nicht verwendet werden, da sie in zukünftigen
Versionen vielleicht nicht mehr unterstützt wird. Die korrekte Syntax
ist cmd -ab -oxxx Datei.
SIEHE AUCH
getopts(1), getsubopt(3C), unistd(4).
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98