Linux命令行参数解析函数——getopt()
=============================================================================
最近在做应用程序的时候常常会用到命令行参数,如cmd -a -b xx,getopt函数的功能就是实现命令行参数解析。
最近在做应用程序的时候常常会用到命令行参数,如cmd -a -b xx,getopt函数的功能就是实现命令行参数解析。
表头文件 #include<unistd.h>
getopt( )函数的声明:
getopt( )函数的声明:
int getopt(int argc,char * const argv[ ],const char * optstring);//定义函数
extern char *optarg;
extern int optind, opterr, optopt;
getopt() 所设置的全局变量包括:
optarg——指向当前选项参数(如果有)的指针。
optind——再次调用 getopt() 时的下一个 argv 指针的索引。
optopt——最后一个未知选项。
optind——再次调用 getopt() 时的下一个 argv 指针的索引。
optopt——最后一个未知选项。
optstring中的指定的内容的意义,如getopt(argc, argv, "ab:c:de::");
1.单个字符,表示选项,(如上例中的abcde各为一个选项)
2.单个字符后接一个冒号:表示该选项后必须跟一个参数,参数紧跟在选项后或者以空格隔开,该参数的指针赋给optarg。(如上例中的b:c:)
3 单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(如上例中的e::,如果没有跟参数,则optarg = NULL)
=============================================================================
下面是我自己的做的一个小的程序为例:
-a 打印我的选择
-b 打印我的选择以及自己输入的信息
-c 打印我的选择以及自己输入的信息
命令的输入难免会有错误, 如果不希望输出任何错误信息,或更希望输出自定义的错误信息。可以采用以下两种方法来更改getopt()函数的出错信息输出行为:
=============================================================================
下面是我自己的做的一个小的程序为例:
-a 打印我的选择
-b 打印我的选择以及自己输入的信息
-c 打印我的选择以及自己输入的信息
命令的输入难免会有错误, 如果不希望输出任何错误信息,或更希望输出自定义的错误信息。可以采用以下两种方法来更改getopt()函数的出错信息输出行为:
- 在调用getopt()之前,将opterr设置为0,这样就可以在getopt()函数发现错误的时候强制它不输出任何消息。
- 如果optstring参数的第一个字符是冒号,那么getopt()函数就会保持沉默,并根据错误情况返回不同字符,如下:
“缺少选项参数” —— getopt()返回':',如果optstring的第一个字符不是冒号,那么getopt()返回'?',这会使得这种情 况不能与无效选项的情况区分开
。
下面是测试的结果:
[wwl@centos6 eeprom]$ ./test -a
my choice is a!
[wwl@centos6 eeprom]$ ./test -b abc
my choice is b!
input is abc!
[wwl@centos6 eeprom]$ ./test -c lmn
my choice is c!
input is lmn!
[wwl@centos6 eeprom]$ ./test -b
缺少字符!
[wwl@centos6 eeprom]$ ./test -l
无效的参数:l!
#include <stdio.h>
#include <unistd.h>
/********************************************************************************
* Description:
* Input Args:
* Output Args:
* Return Value:
********************************************************************************/
int main (int argc, char **argv)
{
int opt;
char ec;
if(argc<2)
{
printf("please input more!\n");
}
while((opt=getopt(argc,argv,":ab:c:"))!=-1)
{
switch(opt)
{
case 'a':
printf("my choice is a!\n");
break;
case 'b':
printf("my choice is b!\n");
printf("input is %s!\n",optarg);
break;
case 'c':
printf("my choice is c!\n");
printf("input is %s!\n",optarg);
case '?':
ec=(char)optopt;
printf("无效的参数:%c!\n",ec);
break;
case ':':
printf("缺少字符!\n");
}
}
return 0;
} /* ----- End of main() ----- */
下面是测试的结果:
[wwl@centos6 eeprom]$ ./test -a
my choice is a!
[wwl@centos6 eeprom]$ ./test -b abc
my choice is b!
input is abc!
[wwl@centos6 eeprom]$ ./test -c lmn
my choice is c!
input is lmn!
[wwl@centos6 eeprom]$ ./test -b
缺少字符!
[wwl@centos6 eeprom]$ ./test -l
无效的参数:l!