linux系统编程——编程杂项——命令行参数

1. 规范

根据规范,我们使用 - 表示 option,option后面可以加关联值arg

wc -l

为了遵守该规则,linux提供了getopt getopt_long函数

2. getopt

       int getopt(int argc, char * const argv[],
                  const char *optstring);
  • 参数说明
    argc 和 argv 用于输入数据。
    optstring 用于 说明 哪些选项可用,以及是否有关联值。
    optstring 是一个字符列表,每个字符代表一个单字符选项,如果一个字符紧跟一个冒号,则表明该选项有一个关联值参数。
getopt(argc, argv, "if:lr");

上面说明,有选项: -i -l -r -f ,其中-f后要紧跟一个文件名参数。

  • 返回值
    返回下一个选项字符(如果存在):getopt返回值是argv数组中的下一个选项字符(如果有的话)。循环调用getopt就可以依次得到每个选项。
    返回-1:若处理完毕
    返回? : 若遇到一个无法识别的选项,并将其保存到外部变量optopt中
    若选项要求关联值,但是用户未提供,则返回?
  • 外部变量
    optarg: 若选项有关联值,则optarg指向这个值
    optopt: 若遇到无法识别的选项,则将其保存在外部变量optopt
    optind: 被设置为下一个待处理参数的索引,getopt用它来记录自己的进度,用户程序很少需要该变量
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
        int opt;


        while ((opt = getopt(argc, argv, "if:lr"))      != -1) {
                switch (opt) {
                        case ‘i‘:
                        case ‘l‘:
                        case ‘r‘:
                                printf("option : %c\n", opt);
                                break;

                        case ‘f‘:
                                printf("filename : %s\n", optarg);
                                break;

                        case ‘:‘:
                                printf("option needs a value\n");
                                break;

                        case ‘?‘:
                                printf("unknow option : %c\n", optopt);
                                break;

                }
        }

        for (; optind < argc; optind++) {
                printf("remaining arguments : %s\n", argv[optind]);
        }

        return 0;
}
[root@VM-0-12-centos test]# ./a.out -i -f ./test.c -f asdf asdf
option : i
filename : ./test.c
filename : asdf
argument : asdf

3. getopt_long

getopt_long接受 双划线(--)的长参数,更明确 参数含义

./longopt --init --list ‘hi there‘ --file fred.c -q
option: i
option: l
filename: fred.c
./longopt: invaild option -- q
unknown option: q
argument: hi there

长选项可以缩写,关联选项可以用--option=value

./longopt --init -l --file=fred.c ‘hi there‘
option i
option l
filename: fred.c
argument: hi there
       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);

getopt_long 大部分参数和getopt一样,只是多了两个参数:
@longopts : 描述长选项
@longindex: 作为optind长选项版本使用

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

@name : 长选项的名称
@has_arg : 该选项是否带参数,0表示不带,1表示必须带,2表示可选参数
@flag : 设置为NULL表示找到该选项时,getopt_long返回在成员val里给出的值,否则getopt_long返回0,并将val值写入flag指向的变量
@val : getopt_long 为该选项返回的值

#include <stdio.h>
#include <unistd.h>

#define _GNU_SOURCE
#include <getopt.h>

int main(int argc, char *argv[])
{
        int opt;

        struct option longopts[] = {
                {"init", 0, NULL, ‘i‘},
                {"file", 1, NULL, ‘f‘},
                {"list", 0, NULL, ‘l‘},
                {"restart", 0, NULL, ‘r‘},
                {0,0,0,0}
        };



        while ( (opt = getopt_long(argc, argv, ":if:lr", longopts, NULL)) != -1) {
                switch (opt) {
                        case ‘i‘:
                        case ‘l‘:
                        case ‘r‘:
                                printf("option : %c\n", opt);
                                break;
                        case ‘f‘:
                                printf("filename : %s\n", optarg);
                                break;
                        case ‘:‘:
                                printf("option needs a value\n");
                                break;
                        case ‘?‘:
                                printf("unknown option : %c\n", optopt);
                                break;

                }
        }

        for (; optind < argc; optind++) {
                printf("remaining argument : %s\n", argv[optind]);
        }

        return 0;
}

linux系统编程——编程杂项——命令行参数

上一篇:【玩转微信公众平台之七】 PHP语法简单介绍


下一篇:外链h5短信浏览器跳转微信关注公众号和小程序解决方案整理