p The option string .Fa optstring may contain the following characters; letters and letters followed by a colon to indicate an option argument is to follow. It does not matter to .Fn getopt if a following argument has leading white space.
p On return from .Fn getopt , .Va optarg points to an option argument, if it is anticipated, and the variable .Va optind contains the index to the next .Fa argv argument for a subsequent call to .Fn getopt .
p The variable .Va opterr and .Va optind are both initialized to 1. In order to use .Fn getopt to evaluate multiple sets of arguments, or to evaluate a single set of arguments multiple times, .Va optind must be initialized to the number of argv entries to be skipped in each evaluation.
p The .Fn getopt function returns -1 when the argument list is exhausted. The interpretation of options in the argument list may be cancelled by the option .Ql -- (double dash) which causes .Fn getopt to signal the end of argument processing and return -1. When all options have been processed (i.e., up to the first non-option argument), .Fn getopt returns -1. .Sh DIAGNOSTICS If the .Fn getopt function encounters an option character that is not contained in .Fa optstring , it returns a question mark
q ? character. If it detects a missing option argument, it returns a colon
q \:
character if the first character of
.Fa optstring
is a colon, otherwise it returns a question mark.
In either case, a diagnostic message is written to
.Em stderr
unless the application has set
.Va opterr
to zero or the first character of
.Fa optstring
is a colon.
.Sh EXAMPLE
The following example comes from section E.9.7 of the IEEE 1003.2-90
standard (POSIX.2).
The following code fragment shows how one might process the arguments for
a utility that can take the mutually exclusive options
.Em a
and
.Em b
and the options
.Em f
and
.Em o ,
both of which require arguments:
p d -literal -compact #include <unistd.h> int main (argc, argv) int argc; char *argv[]; { int c, bflg, aflg, errflg = 0; char *ifile, *ofile; extern char *optarg; extern int optind, optopt; . . . while ((c = getopt(argc, argv, ":abf:o:")) != -1) { switch(ch) { case 'a': if (bflg) errflg = 1; else aflg = 1; break; case 'b': if (aflg) errflg = 1; else bflg = 1; break; case 'f': ifile = optarg; break; case 'o': ofile = optarg; break; case ':': /* -f or -o without option-arg */ fprintf (stderr, "Option -%c requires an option-argument\\n", optopt); errflg = 1; break; case '?': fprintf (stderr, "Unrecognized option: -%c\\n", optopt); errflg = 1; break; } } if (errflg) { fprintf (stderr, "usage: . . .\\n"); exit (2); } argc -= optind; argv += optind; . . . } .Ed .Sh STANDARDS The .Fn getopt function conforms to .St -p1003.2-92 . .Sh HISTORY The .Fn getopt function appeared x 4.3 . .Sh BUGS The .Fn getopt function was once specified to return .Dv EOF instead of -1. This was changed by .St -p1003.2-92 to decouple .Fn getopt from
a <stdio.h> .
p Option arguments are allowed to begin with .Dq Li - ; this is reasonable but reduces the amount of error checking possible.
p A single dash .Dq Li - may be specified as an character in .Fa optstring , however it should .Em never have an argument associated with it. This allows .Fn getopt to be used with programs that expect .Dq Li - as an option flag. This practice is wrong, and should not be used in any current development. It is provided for backward compatibility .Em only . By default, a single dash causes .Fn getopt to returns -1. This is, we believe, compatible with System V.
p It is also possible to handle digits as option letters. This allows .Fn getopt to be used with programs that expect a number
q Dq Li -3 as an option. This practice is wrong, and should not be used in any current development. It is provided for backward compatibility .Em only . The following code fragment works fairly well. d -literal -offset indent int length; char *p; while ((c = getopt(argc, argv, "0123456789")) != -1) switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': p = argv[optind - 1]; if (p[0] == '-' && p[1] == ch && !p[2]) length = atoi(++p); else length = atoi(argv[optind] + 1); break; } } .Ed