1.linux的命令行解析参数之getopt_long函数

1.函数原型:
#include <unistd.h>

extern char *optarg;
extern int optind, opterr, optopt;
#include <getopt.h>
int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);

2.说明:
1、argc和argv和main函数的两个参数一致。
2、optstring: 表示短选项字符串。
"abc:d:012f::"代表:可以支持的短选项有: -a -b -c -d -0 -1 -2 -f等
(1)只有一个字符,不带冒号-----只表示选项,例如: -d
(2)一个字符+一个冒号:表示选项后棉带一个参数,例如:-c 123
(3)一个字符+两个冒号:表示选项后面可以带一个可选参数,如果带参数,则不能有空格,例如:-f789
3、longopts:表示长选项结构体:

	struct option 
	{  
		 const char *name;  
		 int         has_arg;  
		 int        *flag;  
		 int         val;  
	};  
	
    struct option long_options[] = {
        {"add",     required_argument, NULL,  0 },
        {"append",  no_argument,       NULL,  0 },
        {"delete",  required_argument, NULL,  0 },
        {"verbose", no_argument,       NULL,  0 },
        {"create",  required_argument, NULL, 'c'},
        {"file",    required_argument, NULL,  0 },
		{"test1",    no_argument, &lopt,  1 },
		{"test2",    no_argument, &lopt,  2 },
		{"test3",    no_argument, &lopt,  3 },
        {0,         0,                 0,  0 }	//最后一行必须为零,否则段错误
    };
	(1)name:
		表示长选项的名称,如:add、append
	(2)has_arg:
		no_argument(或者是0)时:后面不跟参数,eg:--help
		required_argument(或者是1)时:后面跟参数,eg:--add=123 /--add 123
		optional_argument(或者是2)时:后面跟参数,eg:--add=123
		
	(3)flag:
		flag为NULL,返回val的值;
		flag不为NULL: getopt_long 函数将返回0,且将flag指针指向val(等同于返回val的值)
	(4)val:函数的返回值;
	
4.longindex	:
	指向当前长选项的第几个值,从0开始,即long_options的下标值:
	
5.全局变量:
	(1)optarg:当前选项的参数值
	(2)optind:表示下一个将被处理到的参数在argv中的下标值:


```c
#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 lopt = 0;
        int option_index = 0;
		
        struct option long_options[] = {
            {"add",     required_argument, NULL,  0 },
            {"append",  no_argument,       NULL,  0 },
            {"delete",  required_argument, NULL,  0 },
            {"verbose", no_argument,       NULL,  0 },
            {"create",  required_argument, NULL, 'c'},
            {"file",    required_argument, NULL,  0 },
			{"test1",    no_argument, &lopt,  1 },
			{"test2",    no_argument, &lopt,  2 },
			{"test3",    no_argument, &lopt,  3 },
            {0,         0,                 0,  0 }
        };

	   printf("[%s:%d]:[yang] -------------------- optind = %d\n",__FUNCTION__,__LINE__,optind);
	   printf("[%s:%d]:[yang] optarg = %s\n",__FUNCTION__,__LINE__,optarg);

       c = getopt_long(argc, argv, "abc:d:012f::", long_options, &option_index);	   

	   printf("[%s:%d]:[yang] c = %d,c = %c, option_index = %d\n",__FUNCTION__,__LINE__,c,c,option_index);
	   
        if (c == -1)
            break;
 
       switch (c) 
	   {
        case 0:	//长参数 --
        	printf("option %s", long_options[option_index].name);

			if (optarg)
                printf(" with arg %s", optarg);
            printf("\n");
			
			switch (lopt) 
			{
				case 1:
					printf("long option lopt = %d\n", lopt);
					break;
				case 2:
					printf("long option lopt = %d\n", lopt);
					break;
				case 3:
					printf("long option lopt = %d\n", lopt);
					break;				
				default:
					printf("long option default\n");
					break;						
			}
            break;
 
       	case '0':
        case '1':
        case '2':
            printf("option %c\n", c);
            break;
 
       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;
			
       case 'f':
	   		if (optarg)
            	printf("option f with value '%s'\n", optarg);
			else
				printf("option f with no value \n");
            break;
 
       case '?':
            break;
 
       default:
            printf("?? getopt returned character code 0%o ??\n", c);
        }
    }


	printf("[%s:%d]:[yang] optind = %d\n",__FUNCTION__,__LINE__,optind);
	printf("[%s:%d]:[yang] argc = %d\n",__FUNCTION__,__LINE__,argc);
	
	if (optind < argc) 
	{
		printf("non-option ARGV-elements: ");

		while (optind < argc)
		printf("%s ", argv[optind++]);

		printf("\n");
	}
 	
   	exit(EXIT_SUCCESS);
   
}


打印结果:
aston@ubuntu:/mnt/hgfs/share/source_insight2/main_0$ ./app.out --add=123 --append --test1 -0 -f456 -a
[main:29]:[yang] -------------------- optind = 1
[main:30]:[yang] optarg = (null)
[main:34]:[yang] c = 0,c = , option_index = 0
option add with arg 123
long option default
[main:29]:[yang] -------------------- optind = 2
[main:30]:[yang] optarg = 123
[main:34]:[yang] c = 0,c = , option_index = 1
option append
long option default
[main:29]:[yang] -------------------- optind = 3
[main:30]:[yang] optarg = (null)
[main:34]:[yang] c = 0,c = , option_index = 6
option test1
long option lopt = 1
[main:29]:[yang] -------------------- optind = 4
[main:30]:[yang] optarg = (null)
[main:34]:[yang] c = 48,c = 0, option_index = 0
option 0
[main:29]:[yang] -------------------- optind = 5
[main:30]:[yang] optarg = (null)
[main:34]:[yang] c = 102,c = f, option_index = 0
option f with value '456'
[main:29]:[yang] -------------------- optind = 6
[main:30]:[yang] optarg = 456
[main:34]:[yang] c = 97,c = a, option_index = 0
option a
[main:29]:[yang] -------------------- optind = 7
[main:30]:[yang] optarg = (null)
[main:34]:[yang] c = -1,c = �, option_index = 0
[main:103]:[yang] optind = 7
[main:104]:[yang] argc = 7







猜你喜欢

转载自blog.csdn.net/yanghangwww/article/details/103642656