getopt()
参数、变量说明
#include <unistd.h>
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
argc, argv: 跟 main() 一直
optstring: 接受的选项即选项类别(见下文)。
optarg: 如果选项带参数,则 optarg 指向参数字符串,如 -axxx, 如果 a 是可以接受参数的选项(见下文),则 optarg 指向字符串 "xxx".
optind: option index. The variable optind is the index of the next element to be processed in argv. The system initializes this value to 1. The caller can reset it to 1 to restart scanning of the same argv, or when scanning a new argument vector.
opterr: flag, 如果设置 opterr=0, 则不输出错误。
optopt: 遇到 optstring 中不存在的选项就保存在 optopt 中。
optstring 规则说明
"1abc:d:2::"
1,a,b: 只有选项,无选项参数
c,d: 必须要选项参数(选项和选项参数之间可以有空格)
2: 选项参数可选(可选选项如果选项和选项参数之间有空格,则被视为无选项参数)
返回值
If an option was successfully found, then getopt() returns the option character.
If all command-line options have been parsed, then getopt() returns -1.
If getopt() encounters an option character that was not in optstring, then '?' is returned.
If getopt() encounters an option with a missing argument, then the return value depends on the first character in optstring:
if it is ':', then ':' is returned; otherwise '?' is returned.
#include <unistd.h>
#include <iostream>
using namespace std;
#define OPTSTR "1abc:d:2::"
int main(int argc, char *argv[])
{
opterr = 0;
int iRet = 0;
int count = 0;
cout << "optstring: " << OPTSTR << endl;
cout << "BEGIN: optind=" << optind << endl;
while ( (iRet = getopt(argc, argv, OPTSTR)) != -1 )
{
switch (iRet)
{
case '1':
cout << "-" << (char)iRet << ", value=" << (optarg ? optarg : "(no value)")
<< ", optind=" << optind << ", argv[optind-1]=" << argv[optind - 1] << endl;
break;
case 'a':
cout << "-" << (char)iRet << ", value=" << (optarg ? optarg : "(no value)")
<< ", optind=" << optind << ", argv[optind-1]=" << argv[optind - 1] << endl;
break;
case 'b':
cout << "-" << (char)iRet << ", value=" << (optarg ? optarg : "(no value)")
<< ", optind=" << optind << ", argv[optind-1]=" << argv[optind - 1] << endl;
break;
case 'c':
cout << "-" << (char)iRet << ", value=" << (optarg ? optarg : "(no value)")
<< ", optind=" << optind << ", argv[optind-1]=" << argv[optind - 1] << endl;
break;
case 'd':
cout << "-" << (char)iRet << ", value=" << (optarg ? optarg : "(no value)")
<< ", optind=" << optind << ", argv[optind-1]=" << argv[optind - 1] << endl;
break;
case '2':
cout << "-" << (char)iRet << ", value=" << (optarg ? optarg : "(no value)")
<< ", optind=" << optind << ", argv[optind-1]=" << argv[optind - 1] << endl;
break;
default: // '?'
cout << "error: iRet=" << (char)iRet << ", optind=" << optind
<< ", optopt=" << (char)optopt << endl;
break;
}
++count;
}
cout << "count: " << count << endl;
return 0;
}
/*
correct:
./test -1 -a -b -dvalue -cvalue -2value
./test -1 -dvalue -2value
./test -1 -dvalue -2
./test -1 -a -b -d value -c value -2value
wrong:
./test -1value
./test -x
*/
getopt_long()——既接受短选项,也接受长选项
长选项格式:--option value or --option=value
int getopt_long(int argc, char * const argv[],
const char *optstring,
const struct option *longopts, int *longindex);
struct option {
const char *name;
int has_arg;
int *flag;
int val;
};
name: 长选项名称
has_arg: 选项类型,是否带参数
Symbolic constant | Numeric value | Meaning |
no_argument | 0 | The option does not take an argument. |
required_argument | 1 | The option requires an argument. |
optional_argument | 2 | The option's argument is optional. |
flag, val: 如果 flag 设置为 NULL, 则返回值为 val. 如果 flag 为非 NULL, 则返回值为0, flag 所指向的变量的值被设为 val.
Typically, if flag is not NULL, then val is a true/false value, such as 1 or 0. On the other hand, if flag is NULL, then val is usually a character constant.
如果一个选项既有长格式又有短格式(如 --help 和 -h),将 val 的值设为短格式的值(如 'h')。
int do_all, do_help, do_verbose; /* flag variables */
char *myfile;
struct option longopts[] = {
{ "all", no_argument, & do_all, 1 },
{ "file", required_argument, NULL, 'f' },
{ "help", no_argument, & do_help, 1 },
{ "verbose", no_argument, & do_verbose, 1 },
{ 0, 0, 0, 0 }
};
...
while ((c = getopt_long(argc, argv, ":f:", longopts, NULL)) != -1) {
switch (c)
{
case 'f':
myfile = optarg;
break;
case 0:
/* getopt_long() set a variable, just keep going */
break;
... Error handling code here
}
}
更过例子:
http://linux.die.net/man/3/getopt_long
http://www.informit.com/articles/article.aspx?p=175771&seqNum=3