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 中匹配,但能匹配一个短选项,它就会解析为短选项。

  • 相关阅读:
    97. Interleaving String
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    94. Binary Tree Inorder Traversal
    odoo many2many字段 指定打开的form视图
    docker sentry 配置文件位置
    postgres 计算时差
    postgres 字符操作补位,字符切割
    postgres判断字符串是否为时间,数字
    odoo fields_view_get
  • 原文地址:https://www.cnblogs.com/NickQ/p/11368656.html
Copyright © 2011-2022 走看看