getopt_long的用法

来源:互联网 发布:php开发工程师培训 编辑:程序博客网 时间:2024/06/01 09:12

getopt_long支持长选项的命令行解析,使用man getopt_long,得到其声明如下:
  #include <getopt.h>

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

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

说明:函数中的argc和argv通常直接从main()到两个参数传递而来。optsting是选项参数组成的字符串,如

果该字符串里任一字母后有冒号,那么这个选项就要求有参数。下一个参数是指向数组的指针,这个数组是

option结构数组,option结构称为长选项表,其声明如下:

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

结构中的元素解释如下:
const char *name:选项名,前面没有短横线。譬如"help"、"verbose"之类。
int has_arg:描述长选项是否有选项参数,如果有,是哪种类型的参数,其值见下表:
符号常量             数值            含义
no_argument            0            选项没有参数
required_argument      1            选项需要参数
optional_argument      2            选项参数是可选的
int *flag:
如果该指针为NULL,那么getopt_long返回val字段的值;
如果该指针不为NULL,那么会使得它所指向的结构填入val字段的值,同时getopt_long返回0
int val:
如果flag是NULL,那么val通常是个字符常量,如果短选项和长选项一致,那么该字符就应该与optstring中

出现的这个选项的参数相同;

最后一个参数:longindex参数一般赋为NULL即可;如果没有设置为NULL,那么它就指向一个变量,这个变量

会被赋值为寻找到的长选项在longopts中的索引值,这可以用于错误诊断。

注:GNU提供的getopt-long()和getopt-long-only()函数,其中,后者的长选项字串是以一个短横线开始的

,而非一对短横线。


linux 命令行约定:
     几乎所有的GNU/Linux程序都遵循一些命令行参数定义的约定。程序希望出现的参数可以分成两种:选

项(options or flags)、其他类型的的参数。Options修饰了程序运行的方式,其他类型的参数则提供了输

入(例如,输入文件的名称)。

     对于options类型参数可以有两种方式:
     1)短选项(short options):顾名思义,就是短小参数。它们通常包含一个连字号和一个字母(大写

或小写字母)。例如:-s,-h等。
     2)长选项(long options):长选项,包含了两个连字号和一些大小写字母组成的单词。例如,--

size,--help等。
     *注:一个程序通常会提供包括short options和long options两种参数形式的参数。

     对于其他类型参数的说明:
     这种类型的参数,通常跟随在options类型参数之后。例如,ls –s /功能为显示root目录的大小。’/

’这个参数告诉ls要显示目录的路径。


getopt_long()函数使用规则:

(1)使用前准备两种数据结构
    字符指针型变量
    该数据结构包括了所有要定义的短选项,每一个选项都只用单个字母表示。如果该选项需要参数(如,

需要文件路径等),则其后跟一个冒号。例如,三个短选项分别为‘-h’‘-o’‘-v’,其中-o需要参数,

其他两个不需要参数。那么,我们可以将数据结构定义成如下形式:
const char * const shor_options = “ho:v” ;

    struct option 类型数组
    该数据结构中的每个元素对应了一个长选项,并且每个元素是由四个域组成。通常情况下,可以按以下

规则使用。第一个元素,描述长选项的名称;第二个选项,代表该选项是否需要跟着参数,需要参数则为1,

反之为0;第三个选项,可以赋为NULL;第四个选项,是该长选项对应的短选项名称。另外,数据结构的最后

一个元素,要求所有域的内容均为0,即{NULL,0,NULL,0}。下面举例说明,还是按照短选项为‘-h’‘-o’

‘-v’的例子,该数据结构可以定义成如下形式:
const struct option long_options = {
{  “help”,      0,   NULL,   ‘h’  },
{  “output”,    1,   NULL,   ‘o’  },
{  “verbose”,   0,   NULL,   ‘v’  },
{  NULL,      0,    NULL,   0  }
};

(2)调用方法
     参照(1)准备的两个数据结构,则调用方式可为:
getopt_long( argc, argv, short_options, long_options, NULL);

(3)几种常见返回值
    (a)每次调用该函数,它都会分析一个选项,并且返回它的短选项,如果分析完毕,即已经没有选项了,

则会返回-1。
    (b)如果getopt_long()在分析选项时,遇到一个没有定义过的选项,则返回值为‘?’,此时,程序员可

以打印出所定义命令行的使用信息给用户。
    (c)当处理一个带参数的选项时,全局变量optarg会指向它的参数
    (d)当函数分析完所有参数时,全局变量optind(into argv)会指向第一个‘非选项’的位置

实践小例子:


 

[c-sharp] view plaincopy
  1. #include <stdio.h>  
  2. #include <getopt.h>  
  3. char *l_opt_arg;  
  4. charconst short_options = "nbl:";  
  5. struct option long_options[] = {  
  6.      { "name",     0,   NULL,    'n'     },  
  7.      { "bf_name",  0,   NULL,    'b'     },  
  8.      { "love",     1,   NULL,    'l'     },  
  9.      {      0,     0,     0,     0},  
  10. };  
  11. int main(int argc, char *argv[])  
  12. {  
  13.      int c;  
  14.      while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)  
  15.      {  
  16.          switch (c)  
  17.          {  
  18.          case 'n':  
  19.              printf("My name is XL./n");  
  20.              break;  
  21.          case 'b':  
  22.              printf("His name is ST./n");  
  23.              break;  
  24.          case 'l':  
  25.              l_opt_arg = optarg;  
  26.              printf("Our love is %s!/n", l_opt_arg);  
  27.              break;  
  28.          }  
  29.      }  
  30.      return 0;  
  31. }  

编译并运行:

[root@localhost liuxltest]# gcc -o getopt getopt.c

[root@localhost liuxltest]# ./getopt -n -b -l forever
My name is XL.
His name is ST.
Our love is forever!
[root@localhost liuxltest]#

[root@localhost liuxltest]# ./getopt -nb -l forever
My name is XL.
His name is ST.
Our love is forever!
[root@localhost liuxltest]# ./getopt -nbl forever  
My name is XL.
His name is ST.
Our love is forever!

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子的字写的不好怎么办 孩子爱打人怎么办 6招 一岁宝宝爱打人怎么办 2岁小朋友爱打人怎么办 小朋友爱动手怎么办4岁 5,6岁爱动手打人怎么办 七个月宝宝大便干燥怎么办 两岁宝宝吐奶怎么办 2岁宝宝轻微蛀牙怎么办 2岁宝宝喝水都吐怎么办 2岁宝宝吐的厉害怎么办 两岁宝宝个子矮怎么办 宝宝吐了一天了怎么办 3岁宝宝吃饭呕吐怎么办 3岁宝宝突然呕吐怎么办 11个月婴儿呕吐怎么办 2岁宝宝呕吐是怎么办 2岁宝宝呕吐腹泻怎么办 七个月的宝宝拉肚子怎么办 两岁宝宝玩手机怎么办 5岁宝宝突然口吃怎么办 3岁宝宝突然口吃怎么办 2岁半宝宝结巴怎么办 卤门2岁未闭合怎么办 宝宝2岁说话结巴怎么办 4岁半的宝宝口臭怎么办 2岁宝宝口气重怎么办 2岁宝宝有口气怎么办 2岁宝宝头大怎么办 2周宝宝讲话结巴怎么办 宝贝烧到39度怎么办 4岁宝宝有点口吃怎么办 不小心建了群聊怎么办 宝宝着凉了吐奶怎么办 宝宝便秘肛裂了怎么办 1岁多的宝宝便秘怎么办 8个月小宝宝便秘怎么办 跟他说话不说话怎么办 天猫客服不回复怎么办 三岁宝宝不说话怎么办 六个月宝宝粘人怎么办