![]() |
![]() |
![]() |
Parse options from a command line
#include <unistd.h> int getopt( int argc, char * const argv[], const char * optstring ); extern char * optarg; extern int optind, opterr, optopt;
libc
The getopt() function is a command-line parser that can be used by applications that follow the Utility Syntax Guidelines described below.
The argc and argv parameters are the argument count and argument array, respectively, as passed to main(). The optstring argument is a string of recognized option letters; if a letter is followed by a colon, the option takes an argument. Valid option characters for optstring consist of a single alphanumeric character (letter or numeric digits).
The optind variable is the index of the next element of the argv[] vector to be processed. The system initializes optind to 1 when the program is loaded, and getopt() updates it when it finishes with each element of argv[] (reset optind to 1 if you want to use getopt() to process additional argument sets).
The getopt() function returns the next option character (if one is found) from argv that matches a letter in optstring, if there's one that matches. If the option takes an argument, getopt() sets the variable optarg to point to the option-argument as follows:
When getopt() is called, -1 is returned and optind isn't changed if:
Or, -1 is returned after optind is incremented, if:
If getopt() encounters an option character that isn't contained in optstring, it returns the ? character. If it detects a missing option-argument, it returns : if the first character of optstring is a colon, or ? otherwise. In both cases, getopt() sets optopt to the option character that caused the error.
The getopt() always prints a diagnostic message to stderr unless opterr is set to 0 or the first character of opterr is a : character.
The getopt() function may be used by applications that follow these guidelines:
If an option that doesn't have option-arguments is repeated, the results are undefined.
utility_name [-a] [-b] [-c option_argument] [-d|-e] [-foption_argument] [operand...]
Or:
utility_name [-ab] [-c option_argument] [-d|-e] [-foption_argument] [operand...]
Utilities with very complex arguments may be shown as:
utility_name [options] [operand]
All numbers within the allowable range aren't necessarily semantically correct. A standard utility that accepts an option-argument or operand that's to be interpreted as a number, and for which a range of values smaller than that shown above is permitted, describes that smaller range along with the description of the option-argument or operand. If an error is generated, the utility's diagnostic message indicates that the value is out of the supported range, not that it's syntactically incorrect.
utility_name -f option_argument...[operand...] utility_name [-g option_argument]...[operand...]
indicate that multiple occurrences of the option and its option-argument preceding the ellipses are valid, with semantics as indicated in the Options section of the utility. In the first example, each option-argument requires a preceding -f and at least one -foption_argument must be given.
The next option character specified on the command line; a colon if a missing argument is detected and the first character of optstring is a colon; a question mark if an option character is encountered that's not in optstring and the first character of optstring isn't a colon; otherwise, -1 when all command line options have been parsed.
#include <unistd.h> #include <stdlib.h> #include <stdio.h> int main( int argc, char* argv[] ) { int c, errflag = 0; while( ( c = getopt( argc, argv, "abt:" ) ) != -1 ) { switch( c ) { case 'a': printf( "apples\n" ); break; case 'b': printf( "bananas\n" ); break; case 't': printf( "tree = %s\n", optarg ); break; case '?': ++errflag; break; } } return EXIT_SUCCESS; }
Safety: | |
---|---|
Cancellation point | Yes |
Interrupt handler | No |
Signal handler | No |
Thread | No |
Guidelines 3,4,5,6,7,9 and 10 in the Base Definitions volume of the IEEE Std.1003.1-200x draft, Section 12.2, Utility Syntax Guidelines.
![]() |
![]() |
![]() |