zoukankan      html  css  js  c++  java
  • Linux 命令行参数解析

    在linux中,经常需要各种命令,通常情况下都会带各种参数,而这些参数是如何解析的呢?
    通常使用GNU C提供的函数getopt、getopt_long、getopt_long_only函数来解析命令行参数。
    使用他们需要引用头文件getopt.h。

    原文地址:https://www.cnblogs.com/NickQ/p/11368656.html

    1. getopt()函数

    getopt()用来解析命令行选项参数的,但是只能解析短选项: -d 100,不能解析长选项:--prefix;其原型:

    int getopt(int argc, char * const argv[],const char *optstring);
    

    argc和argv和main函数的两个参数一致,分别表示命令行参数个数和保存参数的字符串数组;
    optstring,是短选项的规则声明,形式如"a:b::cd:",分别表示程序支持的命令行短选项有-a、-b、-c、-d,冒号含义如下:

    1. 只有一个字符,不带冒号——只表示选项, 如-c.
    2. 一个字符,后接一个冒号——表示选项后面带一个参数,如-a 100 或 -a100.
    3. 一个字符,后接两个冒号——表示选项后面带一个可选参数,即参数可有可无,如果带参数,则选项与参数直接不能有空格形式,应该型如-b200. 这里就能解释为什么有时候带参数需要空格,有时候确不需要空格的原因了. 很好理解,不需要空格是因为其参数可选,有空格的话没法判断其是否携带参数。
    4. 有时也会出现形如:a:b::cd:的optstring,其第一个字符是冒号表示如果参数解析过程中,出现参数丢失的情况,则返回值返回":",而不是"?"。方便后续程序区别是选项出错还是参数出错;

    解析的原则根据函数返回值,循环调用该函数,直至该函数将参数解析完毕(返回值为-1).
    具体的返回值描述是:

    1. 如果选项成功找到,返回选项字母;
    2. 如果遇到选项字符不在 optstring 中,返回字符 '?';
    3. 如果遇到丢失参数,那么返回值依赖于 optstring 中第一个字符,如果第一个字符是 ':' 则返回':',否则返回'?'并提示出错误信息。
    4. 如果所有命令行选项都解析完毕,返回 -1;

    另外,在getopt.h中,也定义如下几个全局变量。

    char *optarg —— 指向当前选项参数(如果有参数的话)的指针。ps: 当前选项由返回值传递;
    int optind —— 再次调用 getopt() 时的下一个 argv 指针的索引。
    int optopt —— 最后一个未知选项。一般当出现未知选项,或缺少参数时,它就会保存这个未知选项。
    int opterr ­—— 如果不希望getopt()打印出错信息,则只要将该全局变量opterr设为0即可。
    

    2. getopt_long()函数

    getopt_long()是在getopt()的基础上的拓展,可以获取长参数,如获取--help这种参数。其原型如下:

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

    同样的,argc和argv和main函数的两个参数一致,分别表示命令行参数个数和保存参数的字符串数组;optstring,是短选项的规则声明;
    不同的是getopt_long()有两个解析长参数用到的参数变量;

    • longopts 参数变量是用来描述长选项解析方案的,需要在调用前定义好;例如
    static struct option longopts[] = {
        {"help", no_argument, NULL, 'h'},
        {"module", required_argument, NULL, 'm'},
        {"set", required_argument, NULL, 's'},
        {"get", no_argument, NULL, 'g'},
        {"wakelock", required_argument, NULL, 'l'},
        {"wakeunlock", required_argument, NULL, 'u'},
        {0, 0, 0, 0}
    };
    
    这个option结构体,定义如下:
    struct option
    {
        const char *name;//长选项名
        int has_arg;//是否需要参数
        int *flag;
        int val;
    };
    
    1. has_arg 指明是否带参数值,其数值可选:
      no_argument 表明长选项不带参数,如:--name, --help
      required_argument 表明长选项必须带参数,如:--prefix /root 或 --prefix=/root
      optional_argument 表明长选项的参数是可选的,如:--help 或 --prefix=/root,其它都是错误。
    2. flag和val相互依赖,主要分两种情况:
      (1). flag为NULL,val值用于确定该长选项,所以需要为长选项指定唯一的val值。这里也为长选项和短选项建立了桥梁。
      (2). flag不为NULL,则将val值存放到flag所指向的存储空间,用于标识该长选项出现过。
    • longindex参数变量。如果longindex非空,它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述,即是longopts的下标值。

    3. getopt_long_only 函数

    与 getopt_long 函数使用相同的参数表,在功能上基本一致,只是 getopt_long 只将 --name 当作长参数,但 getopt_long_only 会将 --name 和 -name 两种选项都当作长参数来匹配。如果选项 -name 不能在 longopts 中匹配,但能匹配一个短选项,它就会解析为短选项。

  • 相关阅读:
    三十四:布局之混合布局、圣杯布局、双飞翼布局
    三十三:布局之经典的列布局
    三十二:布局之经典的行布局
    三十一:CSS之CSS定位之position
    三十:CSS之用浮动实现网页的导航和布局
    二十九:CSS之浮动float
    二十八:CSS之列表list-type
    二十七:CSS之背景background
    二十六:CSS之盒子模型之小案例
    二十五:CSS之盒子模型之display属性
  • 原文地址:https://www.cnblogs.com/NickQ/p/11368656.html
Copyright © 2011-2022 走看看