C处理命令行参数 getopt 用法

http://www.youtube.com/watch?v=SjyR74lbZOc 这个视频比较专业,可爱

http://www.youtube.com/watch?v=15nClbf4gAY 这个视频比较实在

https://www.cs.rutgers.edu/~pxk/416/notes/c-tutorials/getopt.html

http://www.ibm.com/developerworks/aix/library/au-unix-getopt.html

命令行的:http://wiki.bash-hackers.org/howto/getopts_tutorial

中文的:http://blog.sina.com.cn/s/blog_6aea878e0100stkd.html

Terminology(术语)

假设有程序
./order_pizza -t -d now anchovies pineapple
那么./order_pizza叫做name of the program
-t是第一个option, 不带参数 (表示是否为厚皮 thick crust)
-d now是第二个option, 表示delivery(派送时间), d是option的名称, now是d的参数.
anchovies和pineapple是第1个argument和第2个argument, 表示pizza的配料.

options 和 arguments的关系
P155 有句话很精典:
Command-line options are command-line arguments prefixed with “-”.

用法
前面已经给出了很多参考链接,讲的都很过细, 简单说一下,查看man 3 getopt可以得知,头文件unistd.h中有定义

int getopt(int argc, char* const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
那么getopt每次返回一个option(包括其带的参数),option的名称保存在optopt中(char型), 选项值保存在optarg中 (char*类型)

第三个参数char *optstring形如x:y:z , 如果跟:表示这个选项带一个参数,比如这里的x, 和y, 如果跟两个::表示这个选项的参数是可选的
如果getopt碰到不认识的option,它返回?, 如果options部分已经结束了(没有以-开始的参数或碰到--),  它返回-1

optarg是option argument的缩写
optind是option index的缩写,表示下一个将要处理的参数的下标.
通过argc-=optind及 argv+=optind可以让程序在处理完options部分后直接定位到真正的arguments部分.
关于什么是options什么是arguments,前面的术语部分已经给出.

代码

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]){
	char* delivery = "";
	int thick = 0;
	int count = 0;
	char ch;

	while((ch = getopt(argc, argv, "d:t")) != EOF){
		switch(ch){
			case 'd':
				delivery = optarg;
				break;
			case 't':
				thick = 1;
				break;
			default:
				fprintf(stderr, "Unknown option: '%s'\n", optarg);	
				return 1;
		}
	}		
	argc -= optind;
	argv += optind;

	if(thick)
		puts("Thick crust.");
	if(delivery[0])
		printf("To be delivered %s.\n", delivery);

	puts("Ingredients:");

	for(count = 0; count < argc; count++){
		puts(argv[count]);
	}

	return 0;
}

编译,运行

gcc -o order_pizza 150.c
./order_pizza -t -d now Anchovies Pineapple
或
./order_pizza -td now Anchovies Pineapple
那么Anchovies之前的部分-t -d now 叫 options, 从Anchovies开始的参数叫 arguments,
now是option d的argument, 保存在全局变量char *optarg中,

什么时候使用--?
问:But what if I want to pass negative numbers as command-line arguments like set_temperature -c -4?
Won't it think that the 4 is an option, not an argument?

答: In order to avoid ambiguity, you can split your main arguments from the options using --.
So you would write set_temperature -c -- -4.
getopt() will stop reading options when it sees the --, so the rest of the line will be read as simple arguments.

生单词:anchovy (凤尾鱼)
C处理命令行参数 getopt 用法

pineapple 菠萝
C处理命令行参数 getopt 用法

参考:head first c

你可能感兴趣的:(getopt)