Originální popis anglicky:
getopt, optarg, opterr, optind, optopt - command option parsing
Návod, kniha: POSIX Programmer's Manual
#include <unistd.h>
int getopt(int
argc, char * const
argv [], const char
*optstring);
extern char *optarg;
extern int optind, opterr, optopt;
The
getopt() function is a command-line parser that shall follow Utility
Syntax Guidelines 3, 4, 5, 6, 7, 9, and 10 in the Base Definitions volume of
IEEE Std 1003.1-2001, Section 12.2, Utility Syntax Guidelines.
The parameters
argc and
argv are the argument count and argument
array as passed to
main() (see
exec() ). The argument
optstring is a string of recognized option characters; if a character
is followed by a colon, the option takes an argument. All option characters
allowed by Utility Syntax Guideline 3 are allowed in
optstring. The
implementation may accept other characters as an extension.
The variable
optind is the index of the next element of the
argv[]
vector to be processed. It shall be initialized to 1 by the system, and
getopt() shall update it when it finishes with each element of
argv[]. When an element of
argv[] contains multiple option
characters, it is unspecified how
getopt() determines which options
have already been processed.
The
getopt() function shall return the next option character (if one is
found) from
argv that matches a character in
optstring, if there
is one that matches. If the option takes an argument,
getopt() shall
set the variable
optarg to point to the option-argument as follows:
- 1.
- If the option was the last character in the string pointed
to by an element of argv, then optarg shall contain the next
element of argv, and optind shall be incremented by 2. If
the resulting value of optind is greater than argc, this
indicates a missing option-argument, and getopt() shall return an
error indication.
- 2.
- Otherwise, optarg shall point to the string
following the option character in that element of argv, and
optind shall be incremented by 1.
If, when
getopt() is called:
argv[optind] is a null pointer*
argv[optind] is not the character -
argv[optind] points to the string "-"
getopt() shall return -1 without changing
optind. If:
argv[optind] points to the string "--"
getopt() shall return -1 after incrementing
optind.
If
getopt() encounters an option character that is not contained in
optstring, it shall return the question-mark (
'?' ) character.
If it detects a missing option-argument, it shall return the colon character (
':' ) if the first character of
optstring was a colon, or a
question-mark character (
'?' ) otherwise. In either case,
getopt() shall set the variable
optopt to the option character
that caused the error. If the application has not set the variable
opterr to 0 and the first character of
optstring is not a colon,
getopt() shall also print a diagnostic message to
stderr in the
format specified for the
getopts utility.
The
getopt() function need not be reentrant. A function that is not
required to be reentrant is not required to be thread-safe.
The
getopt() function shall return the next option character specified on
the command line.
A colon (
':' ) shall be returned if
getopt() detects a missing
argument and the first character of
optstring was a colon (
':'
).
A question mark (
'?' ) shall be returned if
getopt() encounters
an option character not in
optstring or detects a missing argument and
the first character of
optstring was not a colon (
':' ).
Otherwise,
getopt() shall return -1 when all command line options are
parsed.
No errors are defined.
The following sections are informative.
The following code fragment shows how you might process the arguments for a
utility that can take the mutually-exclusive options
a and
b and
the options
f and
o, both of which require arguments:
#include <unistd.h>
int
main(int argc, char *argv[ ])
{
int c;
int bflg, aflg, errflg;
char *ifile;
char *ofile;
extern char *optarg;
extern int optind, optopt;
. . .
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 or -o without operand */
fprintf(stderr,
"Option -%c requires an operand\n", optopt);
errflg++;
break;
case '?':
fprintf(stderr,
"Unrecognized option: -%c\n", optopt);
errflg++;
}
}
if (errflg) {
fprintf(stderr, "usage: . . . ");
exit(2);
}
for ( ; optind < argc; optind++) {
if (access(argv[optind], R_OK)) {
. . .
}
This code accepts any of the following as equivalent:
cmd -ao arg path path
cmd -a -o arg path path
cmd -o arg -a path path
cmd -a -o arg -- path path
cmd -a -oarg path path
cmd -aoarg path path
The following example parses a set of command line options and prints messages
to standard output for each option and argument that it encounters.
#include <unistd.h>
#include <stdio.h>
...
int c;
char *filename;
extern char *optarg;
extern int optind, optopt, opterr;
...
while ((c = getopt(argc, argv, ":abf:")) != -1) {
switch(c) {
case 'a':
printf("a is set\n");
break;
case 'b':
printf("b is set\n");
break;
case 'f':
filename = optarg;
printf("filename is %s\n", filename);
break;
case ':':
printf("-%c without filename\n", optopt);
break;
case '?':
printf("unknown arg %c\n", optopt);
break;
}
}
The following example selects the type of database routines the user wants to
use based on the
Options argument.
#include <unistd.h>
#include <string.h>
...
char *Options = "hdbtl";
...
int dbtype, i;
char c;
char *st;
...
dbtype = 0;
while ((c = getopt(argc, argv, Options)) != -1) {
if ((st = strchr(Options, c)) != NULL) {
dbtype = st - Options;
break;
}
}
The
getopt() function is only required to support option characters
included in Utility Syntax Guideline 3. Many historical implementations of
getopt() support other characters as options. This is an allowed
extension, but applications that use extensions are not maximally portable.
Note that support for multi-byte option characters is only possible when such
characters can be represented as type
int.
The
optopt variable represents historical practice and allows the
application to obtain the identity of the invalid option.
The description has been written to make it clear that
getopt(), like the
getopts utility, deals with option-arguments whether separated from the
option by <blank>s or not. Note that the requirements on
getopt()
and
getopts are more stringent than the Utility Syntax Guidelines.
The
getopt() function shall return -1, rather than EOF, so that
<stdio.h> is not required.
The special significance of a colon as the first character of
optstring
makes
getopt() consistent with the
getopts utility. It allows an
application to make a distinction between a missing argument and an incorrect
option letter without having to examine the option letter. It is true that a
missing argument can only be detected in one case, but that is a case that has
to be considered.
None.
exec() , the Base Definitions volume of
IEEE Std 1003.1-2001,
<unistd.h>, the Shell and
Utilities volume of IEEE Std 1003.1-2001
Portions of this text are reprinted and reproduced in electronic form from IEEE
Std 1003.1, 2003 Edition, Standard for Information Technology -- Portable
Operating System Interface (POSIX), The Open Group Base Specifications Issue
6, Copyright (C) 2001-2003 by the Institute of Electrical and Electronics
Engineers, Inc and The Open Group. In the event of any discrepancy between
this version and the original IEEE and The Open Group Standard, the original
IEEE and The Open Group Standard is the referee document. The original
Standard can be obtained online at http://www.opengroup.org/unix/online.html
.