Linux 命令行编程 getopt_long

 int getopt_long(int argc, char * const argv[],
                  const char *optstring,
                  const struct option *longopts, int *longindex);

extern char *optarg;//选项参数保存
extern int optind, opterr, optopt;

我们先看看用于分析短参数的getopt函数。参数含义如下:

argc, argv是从main函数获取的参数,原样传给getopt;
optstring指示如何分析参数。

关于optstring,还有几点说明:

  1. 如果选项带参数,该选项后接冒号,比如上例中optstring为"a:b",指示a带参数,b没有参数;
  2. 如果选项带可选参数,该选项后接两个冒号,比如"a::b",表明a可能有参数,也可能没有;
  3. 如果optstring的开头字符为':',表明如果指明选项带参数,而实际命令行没有参数时,getopt返回':'而不是'?'(默认情况下返回'?',和无法识别的参数返回一样);
  4. 如果optstring的开头字符为'+',表明一但遇到一个无选项参数,马上停止扫描,随后的部分当作参数来解释;
  5. 如果optstring的开头字符为'-',表明如果遇到无选项参数,则把它当作选项1(不是字符'1')的参数

该函数每解析完一个选项,就返回该选项字符。

如果选项带参数,参数保存在optarg中。如果选项带可选参数,而实际无参数时,optarg为NULL。

当遇到一个不在optstring指明的选项时,返回字符‘?’。如果在optstring指明某选项带参数而实际没有参数时,返回字符‘?’或者字符‘:’,视optstring的第一个字符而定。这两种情况选项的实际值被保存在optopt中。

当解析错误时,如果opterr为1则自动打印一条错误消息(默认),否则不打印。

当解析完成时,返回-1。

每当解析完一个argv,optind就会递增。如果遇到无选项参数,optopt默认会把该参数调后一位,接着解析下一个参数。如果解析完成后还有无选项的参数,则optind指示的是第一个无选项参数在argv中的索引。

函数getopt_long()的工作方式类似于getopt(),不过它还能接收长选项。在接收长选项之前,我们必须定义个一个结构体数组变量longopts,指明我们希望获取的长选项。

struct option {
 const char *name;
 int has_arg;
 int *flag;
 int val;
};

含义如下:

  1. name指明长选项的名称;
  2. has_arg指明该选项是否带参数,1为是,0为否,2为可选;
  3. flag指明长选项如何返回,如果flag为NULL,则getopt_long返回val。
 (For example, the calling program may set val to the equivalent short option character.) 
可以设置短字符和长字符相同。下面的例子中会有所说明。
  1. val指明返回的值,或者需要加载到被flag所指示的变量中。

option数组的最后一个元素必须全部填充0.

getopt_long的最后一个参数longindex在函数返回时指向被搜索到的选项在longopts数组中的下标。longindex可以为NULL,表明不需要返回这个值。

getopt_long_only类似于getopt_long,但是它把'-'开头的选项当作长选项来处理。如果该选项与长选项不匹配,而与短选项匹配,则可以作为短选项解析。

在短选项找到的时候,getopt_long和getopt_long_only的表现和getopt一样。如果长选项找到了,如果flag为NULL,返回val,否则返回0。错误情况的处理和getopt一样,只是返回'?'时还可能是别的情况引起的:选项含糊不明确或者无关参数。

程序例子:

#include <stdio.h>     /* for printf */
#include <stdlib.h>    /* for exit */
#include <getopt.h>

int main (int argc, char **argv) 
{
	int c;
	int digit_optind = 0;

	while (1) {
		int this_option_optind = optind ? optind : 1;
		int option_index = 0;
		static struct option long_options[] = 
		{
			{"add", 0, 0, 'a'},
			{"bench", 0, 0, 'b'},
			{"create", 1, 0, 'c'},
			{"delete", 1, 0, 'd'},
			{0, 0, 0, 0}
		};
		c = getopt_long (argc, argv, "abc:d:",long_options, &option_index);
		if (c == -1) break;

		switch (c) {
			case 'a':
				printf ("option a\n");
				break;

			case 'b':
				printf ("option b\n");
				break;

			case 'c':
				printf ("option c with value ‘%s’\n", optarg);
				break;

			case 'd':
				printf ("option d with value ‘%s’\n", optarg);
				break;

			default:
				printf (" getopt returned character code%s\n", c);
		}
		printf("optind:%d\n",optind);
	}

	if (optind < argc) {
		printf ("non-option ARGV-elements: ");
		while (optind < argc)
			printf ("%s", argv[optind++]);
		printf ("\n");
	}

	exit (0);
}

运行结果:

[jz@localhost ~]$ ./a.out  -a  --add -b --bench -c cp1  --create cp2 -d dp2 --delete dp2
option a
optind:2
option a
optind:3
option b
optind:4
option b
optind:5
option c with value ‘cp1’
optind:7
option c with value ‘cp2’
optind:9
option d with value ‘dp2’
optind:11
option d with value ‘dp2’
optind:13
[jz@localhost ~]$ 

短字符和长字符相同

参考:

http://blog.csdn.net/zhoujunyi/article/details/1577256



你可能感兴趣的:(linux,命令行编程)