/*
getopt的用法和用途类似与在shell脚本当中使用的getopts命令一样,现在讨论在系统调用情况下的使用
包含头文件:#include<getopt.h>
原型:
int getopt (int _argc ,char *const *_argv, const char * _shortopts)
int getopt_long(int _argc,char *const *_argv,const char *shortopts,const struct option *_longopts,int *_longind);
参数解释:
_argc :即main当中的argc
_argv :即main当中的argv
_shortopts:选项字符串,该参数指定了解析命令行参数的规则。getopt认可的命令行选项参数是通过"-"进行的,例如,ls -l的“-l”。该参数中,如果某个选项有输入数据,则在该选项字符的后面应该包括":",如ls -l ./a,在指定本参数时,应该用“l:”。对于该选项,有一点需要注意,如果该参数的第一个字符串是“:”,则getopt发现无效参数后并不返回失败,而是返回“?”或则“:",表示无效参数,则返回":",
getopt只能支持单字符的选项,如-l,-a等,如果需要支持多字符串的选项,如-file等,就需要用到getopt_long通过指定一个struct option 类型的结构数组,将多字符的选项映射为单个字符,从而实现了对个字符选项的支持。struct option的结构如下:
struct option
{
const char * name;//定义了多字符的选项名称
int has_arg;//定义了是否有选项值,如果该值为0,则表示没有选项值,如果该值为1,表示该选项有选项值,如果该值为2,表示该选项的值是可有可无的
int *flag;//如果该成员定义为NULL,则点用getopt_long的返回之为该结构val字段的值,如果该成员不为NULL,getopt_long调用后,将在该参数所指向的 变量中添加val值,并且getopt_long返回0,通常该成员定义为NULL即可
int val;//长选项对应的短选项名称
};
_longind:输出参数,如果该参数没有设置为NULL,那么它是一个指向整型变量的指针,在getopt_long运行时,该整型变量会被赋为获取到的选项在结构数组当中的索引值
返回值说明:
"?":表明getopt返回一个未在_shortopts定义的选项
“:”:表明该选项需要选项值,而实际为输入选项值
-1:表明getopt解析完毕,后面已经没有选项。
0:在getopt_long的结构数组参数_longopts中的成员flag定义了值,此时,getopt_long返回0,而选项的参数将储存在flag所指向的变量中
其他:回返的选项字符
在使用getopt是,需要注意与该系统调用相关的全局变量的使用,详细说明如下。
optind:整型变量,存放环境变量属猪argv的当前索引值,当调用getopt循环取选项结束(getopt返回-1),剩余的参数在argv[optind]~argv[argc-1]中
optarg:字符串指针,当处理一个带有选项的参数时,全局变量optarg将存放该选项的值。
optopt:整型变量,当点用getopt发现无效的选项(getopt返回“?”或“:”)时,此时optopt包含了当前无效的选项。
opterr:整型变量,如果调用getopt前设置该变量为0,则getopt在发现错误时不输出任何信息。
*/
#include<getopt.h>
#include<stdio.h>
int save_flag_arg;
char *opt_arg_value;
struct option longopts[]={
{"flag",no_argument,&save_flag_arg,'f'},
{"name",required_argument,NULL,'n'},
{NULL,0,NULL,0},
};
int main(int argc,char *argv[])
{
int i,c;
while((c=getopt_long(argc,argv,":n:f",longopts,NULL)) != -1)
{
switch(c)
{
case 'n':
opt_arg_value =optarg;
printf("name is %s.\n",opt_arg_value);
break;
case 0 :
if (save_flag_arg =='f')
{
printf("flag argument found!\n");
}
break;
case ':':
printf("argument %c need value.\n",optopt);
break;
case '?':
printf("Invalid argument %c!\n",optopt);
break;
}
}
return 0;
}
/*
我直接的终端运行是如下:
1-------------------------------------------
jiangjian@jiangjian-K42JZ:~/cprogram/process$ ./getopt --name jiangjian //注意如果是多字符的话前面得写"--",单字符都可
name is jiangjian.
jiangjian@jiangjian-K42JZ:~/cprogram/process$
2
jiangjian@jiangjian-K42JZ:~/cprogram/process$ ./getopt -n jiangjian
name is jiangjian.
jiangjian@jiangjian-K42JZ:~/cprogram/process$
*/
linux程序如何获得参数
最新推荐文章于 2021-05-12 11:36:40 发布