getopt関数
1.getopt関数の説明
#include<unistd.h>
extern char *optarg;
extern int optind, opterr, optopt;
int getopt(int argc, char * const argv[], const char *optstring)
/* *
* @作用:是一个简单的解析命令可选项的函数,只能进行简单的格式命令解析,其格式如下:
* cmd [-a][-b] 对短选项的解析
* cmd [-a argument_a][-b argument_b] 对短选项及短选项的参数解析
* cmd [-a[argument_a]] 选项a长度参数也是可选的情况解析
* @参数说明:
* argc,argv:为调用main函数时传入的参数。传入的‘-’开始的字符被解析为选项,getopt一次执行解析出一个
* option,如果循环执行,可以将argv中的全部option解析出来;
* optstring:指定选项合法的选项,一个字符代表一个选项,在字符后面接一个‘:'表示该选项带一个参数,字符
* 后带两 个‘:’表示该选项带可选参数(参数可有可无)若有参数,用optarg指向该参数,否则optarg为0;
*
* @返回值:
* int,函数返回值,有以下几种情况:
* 1. 传入的argv所有参数已经被解析完成,getopt函数返回-1;
* 2. 如果argv中解析出optstring中描述的选项字符,则返回该字符,如果该选项指定了参数,
* 则全局变量optarg指向该参数
* 3. 如果getopt遇到一个非optstring指定的选项字符,这表示该选项是未识别的,返回'?',
* 并且将该选项存放到全局变量optopt中
* 4. 如果optstring指定了选项必须带参数,但传入的相应option丢失了参数,返回值依赖于
* optstring的第一个字符,若第一个字符是':',返回':',否则返回'?';由于非法的选项
* 返回也是'?',所以常常optstring的第一个字符指定为':';同时将该选项存放到全局变量
* optopt中
*
* @extern 变量说明:
* optarg:用来保存选项的参数
* optind:记录下一个检索的位置
* opterr:是都将错误信息输出到stderr,0为不输出到stderr中
* optopt:不在选项字符串optstring中的选项
*
* @选项字符串实例:
* “a:bd::”
* 该字符串为一个选项字符串,其对应的命令就是-a, -b, -d。其中a后面是要必须跟一个参数,没有参
* 数是会报错的,该参数可以和-a连在一起,也可以用空格隔开(-a123 or -a 123);b后面是不需要跟参
* 数的;-d后面可以跟参数也可以不用跟参数,但需要注意有参数时,参数和选项之间不能有空格,否则认为
* 无参数;
* 总结:一个冒号表示后面必须跟一个参数,可以用空格或不用空格隔开选项和参数;两个冒号表示选项后
* 面可以跟参数也可以不跟参数,若要跟参数,必须要和选项连在一起。
*/
2.コード例
//GetOpt.cpp
#include <unistd.h>
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
int ret = -1;
for(int i = 0; i < argc; ++i)
{
cout << argv[i] << " ";
}
cout << endl;
extern char* optarg;
extern int optind, opterr, optopt;
/* *
* @"t:h::f":
* 选项-t:需要带一个参数
* 选项-h:可以带参数也可以不带参数
* 选项-f:不用带参数
* */
while(-1 != (ret = (getopt(argc, argv, "t:h::f"))))
{
switch(ret){
case 'f':
cout << "option: " << (char)ret << endl;
break;
case 't':
cout << "option: " << (char)ret << ", arg: " << optarg << endl;
break;
case 'h':
if(optarg)
cout << "option: " << (char)ret << ", arg: " << optarg << endl;
else
cout << "option: " << (char)ret << ", not add param"<< endl;
break;
case '?':
cout << "not has option: " << (char)optopt << endl;
break;
}
}
return 0;
}
コンパイル
g++ GetOpt.cpp -o opt
エグゼクティブの指示
1、 ./opt -t 90 -h100 -f
结果打印:
option: t, arg: 90
option: h, arg: 100
option: f
2、./opt -t90 -h 100 -f
结果打印:
option: t, arg: 90
option: h, not add param
option: f
说明: -h和参数100中间有空格,所以检测不到其后面的参数
3、./opt -t90 -h 100 -f -d
结果打印:
option: t, arg: 90
option: h, not add param
option: f
./opt: invalid option -- 'd'
not has option: d
说明: -d不在optstring选项中,故报错,认为是无效的选项