在Linux中我们经常见到执行命令时,需要输入参数,例如
rm -rf folder 中的
-rf 就属于输入的参数,其中
-r 是:递归处理, 将指定目录下的所有文件与子目录一并处理;
-f 是强制删除文件或目录。在看开源代码时也应该会经常见到
getopt() 。
一、getopt介绍
getopt() 方法是用来分析命令行参数的,该方法由 Unix 标准库提供,包含在 <unistd.h> 头文件中。
getopt() 函数结构定义
#include <unistd.h>
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
int main(int argc, char* argv[]){
}
getopt 参数说明:
- argc:就是main的形参argc,表示参数的数量
- argv:就是main的形参argv,表示参数的字符串变量数组
- optstring:选项字符串,一个字母表示一个短参数,如果字母后带有“:”,表示这个参数必须带有参数。如
"a:b:c" ,则程序可以接受参数"-a 10 -b 1000 -c" 。 注意:其中短参数在getopt定义里分为三种: 1)不带值的参数,它的定义即是参数本身。 2)必须带值的参数,它的定义是在参数本身后面再加一个冒号。 3)可选值的参数,它的定义是在参数本身后面加两个冒号 。
这里用"2ab:c::" 作为样例说明,其中的2,a 是不带值的参数,b 是必须带值的参数,c 是可选值的参数。 在实际调用中,可以写成'-2 -a -b hello -c' ,或者 '-2 -a -b bhello -cchello' , 或者'-2a -bhello -cchello' 。 这里需要注意: 1)不带值的参数可以连写,像2 和a 是不带值的参数,它们可以-2 -a 分开写,也可以-2a 或-a2 连写。 2)参数不分先后顺序,'-2a -b hello -cchello' 和'-b hello -cchello -a2' 的解析结果是一样的。 3)要注意可选值的参数的值与参数之间不能有空格,必须写成-cchello 这样的格式,如果写成-c chello 这样的格式就会解析错误
变量说明:
- optarg:如果某个选项有参数,用于获取传入的参数值,包含当前选项的参数字符串
- optind:argv 的当前索引值。当getopt()在while循环中使用时,循环结束后,剩下的字串视为操作数,在argv[optind]至argv[argc-1]中可以找到
- opterr:正常运行状态下为 0。非零时表示存在无效选项或者缺少选项参数,并输出其错误信息
- optopt:当发现无效选项字符之时,getopt()函数或返回’?‘字符,或返回’:'字符,并且optopt包含了所发现的无效选项字符
二、举例子说明
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
int para;
const char *optstring = "abc:d::";
while ((para = getopt(argc, argv, optstring)) != -1) {
switch (para) {
case 'a':
printf("parameter opt is a, oprarg is: %s\n", optarg);
break;
case 'b':
printf("parameter opt is b, oprarg is: %s\n", optarg);
break;
case 'c':
printf("parameter opt is c, oprarg is: %s\n", optarg);
break;
case 'd':
printf("parameter opt is d, oprarg is: %s\n", optarg);
break;
case '?':
printf("error optopt: %c\n", optopt);
printf("error opterr: %d\n", opterr);
break;
}
}
return 0;
}
编译运行结果: 分析:
注意这里可选参数 选项 -d 后面跟参数的时候,一定不能有空格。 但是如果是 必选参数,即选项后面只有一个冒号,则是有没有空格都可以。 getopt()每次调用会逐次返回命令行传入的参数。 当没有参数的最后的一次调用时,getopt()将返回-1。 当解析到一个不在optstring里面的参数,或者一个必选值参数不带值时,返回’?’。 当optstring是以’:‘开头时,缺值参数的情况下会返回’:’,而不是’?’ 。
推荐文章
[1]https://blog.csdn.net/afei__/article/details/81261879 [2]: https://blog.51cto.com/vopit/440453 [3]: https://www.cnblogs.com/yinghao-liu/p/7123622.html 2021-09-02。。。
|