简介:
getopt()和getlopt_long()是用来解析命令行参数的。getopt()只能用来处理短选项,如:test -h,而getlopt_long()既可以处理短选项也可以处理长选项,如:test --help。
-a、-A、-b都表示短选项,--all、--author、--almost-all 都表示长选项。
一、getopt函数
1、头文件
#include <getopt.h>
#include <stdlib.h>
#include <unistd.h>
2、函数介绍
2.1 原型
int getopt(int argc,char * const argv[ ],const char * optstring);
功能:用来解析命令行选项参数,只适用于短选项:-d /root; 不能解析长选项--arch, --help等
参数介绍:
- argc是参数个数;
- argv是参数的字符串数组(不要忘记argv[0]是"./可执行文件名");
- 而第三个参数optstring就是选项字符串。
返回值:
- 选项解析成功,返回这个选项字符
- 若解析完毕,则返回-1或者EOF。
- 若选项未定义,则提示错误信息,并返回'?'
2.2 optstring字符串格式介绍
- 单个字符:表示没有参数
- 单个字符跟1个冒号:表示必须有参数,格式:-d xxx或者-dxxx
- 单个字符跟2个冒号:表示参数可有可无,格式:-d 或者 -dxxx
举例:
char *optstring="ab:c::";
运行程序可以给最多三个参数,分别为-a,-b和-c,其中
a选项 :因为没有跟冒号,不能有参数,如:-a
b选项 :因为后面跟了1个冒号,必须有参数,如:-b 100
c选项 :因为跟了2个冒号,参数可有可无,如:-c 100 或 -c 都行
2.3 函数全局变量
变量名称 | 作用 |
char* optarg | 指向当前解析的选项参数的指针 |
int optind | 记录当前已遍历选项的索引,方便下次调用时直接找到下一个选项 举例: ./test -a 1 -b 2 最初还未解析时,optind为1,因为-a的下标为1, 解析完-a后optind的值就变为3,因为-b的下标为3, 解析完-b后,optint变为5,但argv[5]为空,说明解析完毕,此时getopt函数便返回-1。 |
int opterr | 在非0时会将错误信息标准输出到显示屏,但若被设为0,将不会输出错误信息 |
int optopt | 若一个选项在argv中,但不在选项字符串中时,或者一个带参数的选项没有参数时,getopt()会返回字符?,同时将optopt设为该选项 |
3、示例
#include <stdio.h>
#include <unistd.h>
#include <getopt.h>
void main(int argc, char **argv)
{
int flags, opt;
while((opt = getopt(argc, argv, "ab:c::")) != -1){
switch(opt){
case 'a':
printf("Input %d parameter is -a=%s\n", optind, optarg);
break;
case 'b':
printf("Input %d parameter is -b=%s\n", optind, optarg);
break;
case 'c':
printf("Input %d parameter is -c=%s\n", optind, optarg);
break;
default:
printf("Not match!!!");
}
}
return ;
}
运行结果:
$ ./getopt_test -a -b 123 -c456
Input 2 parameter is -a=(null)
Input 4 parameter is -b=123
Input 5 parameter is -c=456
二、getopt_long函数
1、函数原型
int getopt_long(int argc, char * const argv[], const char *optstring,const struct option *longopts, int *longindex);
1.1 对比 getopt_long 和 getopt 差异
新增参数:
- longopts:长选项参数的名称、属性、以及解析后的返回值等结构信息
struct option {
const char *name; /* 参数名称 */
int has_arg; /* 指明是否带有参数 */
int *flag; /* flag=NULL时,返回value;不为空时,*flag=val,返回0 */
int val; /* 用于指定函数找到选项的返回值或flag非空时指定*flag的值 */
};
has_arg表示选项后面是否携带参数
配置 | 说明 | 举例 |
no_argument | 不带参数 | 如: --version,--help |
required_argument | 必须带参数 | --参数 值 或者 --参数=值。如:--dir=/root |
optional_argument | 参数可选 | 只能为:--参数=值 |
- longindex:用来记录解析到的当前长选项的索引,也就是longopts的下标,通常设为NULL
返回值:
对于短选项,返回值同getopt函数;对于长选项,如果flag是NULL,返回val,否则返回0;对于错误情况返回值同getopt函数
2、示例
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>
static char *opt_storage = "ab:c::";
static const struct option storage_opts[] = {
{ "a_long", no_argument, 0, 'a' },
{ "b_long", required_argument, 0, 'b' },
{ "c_long", optional_argument, 0, 'c' },
{ 0, 0, 0, 0},
};
int main(int argc, char **argv)
{
int opt = 0;
int parm = 0;
int object = 0;
char *dir = NULL;
while (1) {
int opt_index = 0;
opt = getopt_long(argc, argv, opt_storage, storage_opts, &opt_index);
if (opt == -1)
break;
switch (opt) {
case 'a':
printf("Input %d parameter is -a=%s\n", optind, optarg);
break;
case 'b':
printf("Input %d parameter is -b=%s\n", optind, optarg);
break;
case 'c':
printf("Input %d parameter is -c=%s\n", optind, optarg);
break;
default:
break;
}
}
return 0;
}
运行结果:
$ ./aptget_long --a_long --b_long 123 --c_long=456
Input 2 parameter is -a=(null)
Input 4 parameter is -b=123
Input 5 parameter is -c=456