- argc,argv是什么
- 如何解析程序参数
- “选项”是什么?
- "选项字符串"是什么
- 解析参数
如果你是一个 Linux 开发者,那么你一定需要给应用程序传递参数。
刚接触C语言的童鞋,学的第一个程序一定是这样的
#includeint main() { printf("hello worldn"); }
接触完 Linux 下C语言编程的童鞋,他会这样做
#includeint main(int argc,char*argv[]) { printf("argc:%d,argv[0]:%sn",argc,argv[0]); }
这个argc,argv有什么用?,先看下输出结果
# ./main argc:1,argv[0]:./main
我们传递一个参数看看
# ./main -v argc:2,argv[0]:./main
可以大概猜一下,argc跟命令行参数数量有关,argv跟命令行参数有关
修改下程序试着获取传递的参数
#includeint main(int argc,char*argv[]) { for(int index=0;index 测试一下效果
# ./main argc:0, argv[0]:./main # ./main -p argc:0, argv[0]:./main argc:1, argv[1]:-p # ./main -p 80 argc:0, argv[0]:./main argc:1, argv[1]:-p argc:2, argv[2]:80这次可以确定了,argc是传递给应用程序的参数个数,argv是传递给应用程序的参数,且第一个参数为程序名。
如何解析程序参数既然argc,argv可以传递参数,那我们如何分析命令行参数?
这里有个函数给大家介绍下
#includeint getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt; 函数说明:getopt()用来分析命令行参数。
“选项”是什么?
1、参数argc 和argv 是由main()传递的参数个数和内容
2、参数optstring 则代表准备处理的选项字符串在linux下大家都用过这样一条指令吧:gcc -o main main.cpp
这条指令中的 -o 就是命令行的选项,后面的 main 是 -o 选项所携带的参数
有些选项是不用带参数的,而这样不带参数的选项可以写在一起,例如 rm -rf。
"选项字符串"是什么先看例子吧,"a:b:cd::e",这就是一个选项字符串。对应到命令行就是-a ,-b ,-c ,-d, -e 。
冒号又是什么呢? 冒号表示参数,一个冒号就表示这个选项后面必须带有参数,没有参数就会报错。
参数的输入形式 -p80 或者 -p 80,都表示 80 是 -p 的参数。
两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数。
需要注意的是两个冒号之间不能有空格。
解析参数了解完选项和选项参数之后就是通过 getopt 这个函数解析参数了
在此之前了解一下几个全局参数
extern char *optarg; 用来保存选项的参数
extern int optind 用来记录下一个检索位置
opterr 是否将错误信息输出到stderr,为0时表示不输出
optopt 保存的是无法识别的选项
大概了解完之后,我们的示例程序如下
#include#include int main(int argc,char*argv[]) { int optch = 0; while((optch = getopt(argc, argv, "a:b:cd::e")) != -1) { // printf("optind: %dn", optind); //下一个检索位置,即选项的参数位置 switch (optch) { case 'a': printf("-a %sn", optarg); break; case 'b': printf("-b %sn", optarg); break; case 'C': case 'c': printf("-c %sn", optarg); break; case 'd': printf("d:%sn", optarg); break; case 'e': printf("-e %sn", optarg); break; case '?': printf("Unknown option: %cn",(char)optopt); //表示不在选项字符串optstring中的选项 break; default: break; } } // printf("opterr:%dn",opterr); //opterr表示是否将错误信息输出到stderr,为0时表示不输出 } 测试程序的选项字符串是a:b:cd::e ,对应的是几个case标签,执行程序分别验证下
a和b有一个 : ,所以a,b选项后面必须携带参数
# ./main -a test -a test # ./main -b ./main: option requires an argument -- 'b' Unknown option: b不携带参数的话就会无法识别参数
c和e没有 : ,所以 c 选项就类似于 -version 一类的选项
# ./main -c -c (null) # ./main -c test -c (null)d有两个: ,所以d选项的参数是可选的,但是要注意参数与选项之间不能有空格
# ./main -dtest d:test # ./main -d test d:(null)Linux基础知识科普就介绍到这里,下一期是关于文件 *** 作的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)