您的位置:首页 > 运维架构 > Linux

Linux选项解释-getopt和getopt_long函数

2010-08-16 09:53 579 查看

Linux选项解释-getopt和getopt_long函数

一、命令行简介

解释分析命令行通常是所以程序的第一个任务,C语言通过argc和argv参数来访问它的命令行参数。

最简单的命令行处理技术可以通过if判断来表示,如下例:

if(argc>1 &&argv[1][0] ==

-

&&argv[1][1] ==

h

) //判断命令行参数是否为-n

{

do
_
some
thing();

}

这样处理简单有序的命令行还可以,对于复杂的命令行处理显得有心无力,于是GNU提供两个函数专门用来处理命令行参数:getopt和getopt_long。

二、getopt函数

getopt()函数声明如下:

C代码

#include <unistd.h>

Int getopt(int
argc,
char
*
const
argv[],
const

char
*optstring);

extern

char
*optarg;

extern

int
optind, opterr, optopt;

#include <unistd.h>

Int getopt(int argc, char *const argv[], const char *optstring);

extern char *optarg;

extern int optind, opterr, optopt;



明:函数中的argc和argv通常直接从main()到两个参数传递而来。optsting是选项参数组成的字符串,如果该字符串里任一字母后有冒号,
那么这个选项就要求有参数,optarg就是选项参数。optind是当前索引,optopt用于当发现无效选项字符的时候,getopt函数或者返回
“?”或者返回“:”字符,并且optopt包含了所发现的无效选项字符。

如果optstring参数的第一个字符是冒号,那么getopt会根据错误情况返回不同的字符,当错误是无效选项,getopt返回“?”,当错误是缺少选项参数,getopt返回“:”。

注:GNU getopt()第三个特点是optstring中的选项字符后面接两个冒号,就允许该选项有可选的选项参数。在选项参数不存在的情况下,GNU getopt()返回选项字符并将optarg设置为NULL。

例子:

C代码

#include <stdio.h>

#include <unistd.h>

#include <getopt.h>

char
*para =
":ab:c"
;

int
main(
int
argc,
char
*argv[])

{

int
oc = -1;

char
*b_input = NULL;

while
((oc = getopt(argc, argv, para)) != -1)

{

switch
(oc)

{

case

'a'
:

printf("input para is a/n"
);

break
;

case

'b'
:

b_input = optarg;

printf("input para is b,and optarg is %s/n"
, b_input);

break
;

case

'c'
:

printf("input para is c/n"
);

break
;

case

':'
:

printf("option %c requires an argument/n"
,optopt);

break
;

case

'?'
:

default
:

printf("option %c is invalid:ignored/n"
,optopt);

break
;

}

}

return
0;

}

#include <stdio.h>

#include <unistd.h>

#include <getopt.h>

char *para = ":ab:c";

int main(int argc, char *argv[])

{

int oc = -1;

char *b_input = NULL;

while((oc = getopt(argc, argv, para)) != -1)

{

switch(oc)

{

case 'a':

printf("input para is a/n");

break;

case 'b':

b_input = optarg;

printf("input para is b,and optarg is %s/n", b_input);

break;

case 'c':

printf("input para is c/n");

break;

case ':':

printf("option %c requires an argument/n",optopt);

break;

case '?':

default:

printf("option %c is invalid:ignored/n",optopt);

break;

}

}

return 0;

}


编译:

[root@heguangwu projects]# gcc -o getopt_ex getopt_ex.c

运行:

[root@heguangwu projects]# ./getopt_ex -a

input para is a

[root@heguangwu projects]# ./getopt_ex -a -b

input para is a

option b requires an argument

[root@heguangwu projects]# ./getopt_ex -d

option d is invalid:ignored

三、getopt_long函数

getopt_long用来处理长选项,使用

man 3 getopt_long
,得到其声明如下:

C代码

#include <getopt.h>

int
getopt_long(
int
argc,
char
*
const
argv[],
const

char
*optstring,

const

struct
option *longopts,
int
*longindex);

int
getopt_long_only(
int
argc,
char
*
const
argv[],
const

char
*optstring,

const

struct
option *longopts,
int
*longindex);

#include <getopt.h>

int getopt_long(int argc, char * const argv[], const char *optstring,

const struct option *longopts, int *longindex);

int getopt_long_only(int argc, char * const argv[], const char *optstring,

const struct option *longopts, int *longindex);


前三个参数与getopt相同,下一个参数是指向数组的指针,这个数组是option结构数组,option结构称为长选项表,其声明如下:

C代码

struct
option

{

const

char
*name;

int
has_arg;

int
*flag;

int
val;

};

struct option
{

const char *name;

int  has_arg;

int  *flag;

int  val;

};


结构中的元素解释如下:

const char *name
:选项名,前面没有短横线

int has_arg:描述长选项是否有参数,其值见下表

符号常量

数值

含义

no_argument

required_argument

optional_argument

0

1

2

选项没有参数

选项需要参数

选项参数是可选的

int *flag:

如果该指针为NULL,那么getopt_long返回val字段的值;

如果该指针不为NULL,那么会使得它所指向的结构填入val字段的值,同时getopt_long返回0

int val:

如果flag是NULL,那么val通常是个字符常量,如果短选项和长选项一致,那么该字符就应该与optstring中出现的这个选项的参数相同;

C代码

#include <stdio.h>

#include <unistd.h>

#include <getopt.h>

char
*para =
":ab:cf:v"
;

int
do_all = 0;

int
do_help = 0;

int
do_version = 0;

char
*file = NULL;

struct
option longopt[] =

{

{"all"
, no_argument, &do_all, 1},

{"file"
, required_argument, NULL,
'f'
},

{"help"
, no_argument, &do_help, 1},

{"version"
, no_argument, &do_version, 1},

{"bob"
, required_argument, NULL,
'b'
},

{0, 0, 0, 0},

};

int
main(
int
argc,
char
*argv[])

{

int
oc = -1;

char
*b_input = NULL;

while
((oc = getopt_long(argc, argv, para, longopt, NULL)) != -1)

{

switch
(oc)

{

case

'a'
:

printf("input para is a/n"
);

break
;

case

'b'
:

b_input = optarg;

printf("input para is b,and optarg is %s/n"
, b_input);

break
;

case

'c'
:

printf("input para is c/n"
);

break
;

case

'v'
:

printf("input para is v/n"
);

break
;

case

'f'
:

printf("input para is f/n"
);

file = "hello world"
;

break
;

case
0:

break
;

case

':'
:

printf("option %c requires an argument/n"
,optopt);

break
;

case

'?'
:

default
:

printf("option %c is invalid:ignored/n"
,optopt);

break
;

}

}

printf("do_all is %d/n"
,do_all);

printf("do_help is %d/n"
,do_help);

printf("do_version is %d/n"
,do_version);

printf("do_file is %s/n"
,file);

printf("bob is %s/n"
, b_input);

return
0;

}

#include <stdio.h>

#include <unistd.h>

#include <getopt.h>

char *para = ":ab:cf:v";

int do_all = 0;

int do_help = 0;

int do_version = 0;

char *file = NULL;

struct option longopt[] =

{

{"all", no_argument, &do_all, 1},

{"file", required_argument, NULL, 'f'},

{"help", no_argument, &do_help, 1},

{"version", no_argument, &do_version, 1},

{"bob", required_argument, NULL, 'b'},

{0, 0, 0, 0},

};

int main(int argc, char *argv[])

{

int oc = -1;

char *b_input = NULL;

while((oc = getopt_long(argc, argv, para, longopt, NULL)) != -1)

{

switch(oc)

{

case 'a':

printf("input para is a/n");

break;

case 'b':

b_input = optarg;

printf("input para is b,and optarg is %s/n", b_input);

break;

case 'c':

printf("input para is c/n");

break;

case 'v':

printf("input para is v/n");

break;

case 'f':

printf("input para is f/n");

file = "hello world";

break;

case 0:

break;

case ':':

printf("option %c requires an argument/n",optopt);

break;

case '?':

default:

printf("option %c is invalid:ignored/n",optopt);

break;

}

}

printf("do_all is %d/n",do_all);

printf("do_help is %d/n",do_help);

printf("do_version is %d/n",do_version);

printf("do_file is %s/n",file);

printf("bob is %s/n", b_input);

return 0;

}


执行的结果:

只显示关键结果

[root@heguangwu projects]# ./opt_ex2 -a

input para is a

[root@heguangwu projects]# ./opt_ex2 --all

do_all is 1

[root@heguangwu projects]# ./opt_ex2 -f h

input para is f

do_file is hello world

[root@heguangwu projects]# ./opt_ex2 --bob aa

input para is b,and optarg is aa

bob is aa

[root@heguangwu projects]# ./opt_ex2 -b aa

input para is b,and optarg is aa
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: