Linux 编程学习笔记 (getopt 的用法)

原文写于 2007 年,这次 blog 搬家,一并搬到这里。

通常 Linux 下的各种命令都有许多的命令行参数可以选择,比如:


gcc -g -lm foo.c -o foo

getopt()就是用来分析命令行参数的函数。
在继续讨论getopt 之前,先要明确两个概念:选项(option) 和 选项参数(argument)。
在上面的例子中,-g 中的 g,-o 中的 o 还有 -lm 中的 l 就是选项,而 -lm 中的 m 就是 l 的选项参数,-o foo 中的 foo 就是 o 的选项参数。因此,我们知道了选项有两种,一种是带选项参数的,另一中是不带选项参数的。
下面我们就可以继续讨论 getopt() 了。

首先是函数声明:

#include <unistd.h>
extern char *optarg;
extern int optind;
extern int optopt;
extern int opterr;
extern int optreset;
int getopt(int argc, char * const *argv, const char *optstring);


getopt()每调用一次返回一个选项。
argc 和 argv 很显然就是 main 函数的两个参数。
字符串 optstring 可以包含下列元素:单个字符,字符后面接一个冒号说明后面跟随一个选项参数,字符后面接两个冒号说明后面跟随一个可有可无的选项参数。例如,一个选项字符 "x" 表示选项 "-x" ,选项字符 "x:" 表示选项和其参数 "-x argument",选项字符 "x::" 表示选项 x 的参数是可选的(“::” 是 GNU 增加的,不一定在所有的UNIX 系统下都可以使用)。
getopt()的返回后,如果有选项参数的话 optarg 指向选项参数,并且变量 optind 包含下一个 argv 参数作为对 getopt() 下一次调用的索引。变量 optopt 保存最后一个由 getopt() 返回的已知的选项。
当参数列已经到结尾时getopt()函数返回-1,当遇到一个未知的选项时 getopt 返回'?'。参数列中选项的解释可能会被'--'取消,由于它引起 getopt()给参数处理发送结束信号并返回-1。
比如:
./getopt -a -- -c -b foo
getopt 的源代码在下面,getopt 将只会解释到 -a。
下面是一个最简单的例子:

/* getopt.c */
#include <unistd.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
    int aflag=0, bflag=0, cflag=0;
    int ch;
//  opterr = 0;
    while ((ch = getopt(argc, argv, "ab:c")) != -1)
    {
        printf("optind: %d\n", optind);
        switch (ch) {
        case 'a':
            printf("HAVE option: -a");
            aflag = 1;
            break;
        case 'b':
            printf("HAVE option: -b");
            bflag = 1;
            printf("The argument of -b is %s\n", optarg);
            break;
    case 'c':
            printf("HAVE option: -c");
            cflag = 1;
            break;
        case '?':
            printf("Unknown option: %c\n",(char)optopt);
            break;
        }
    }
}

 

程序很简单,在此就不作解释了。
变量opterr和optind都被初始化为1。如果想要略去命令行的前几个参数,可以在调用getopt()前将optind设成其他值。
如果不希望getopt()输出出错信息,将全域变量 opterr 设为 0 即可。

GNU Linux 中对 getopt 做了相应的扩展,提供了对长参数,例如 “--help” 的支持。主要是提供了 getopt_long  函数,现在我还没有完全学会,等学会了后再来些一篇短文介绍它。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
getoptLinux下的一个命令行参数解析函数。其基本的语法格式为: getopt [选项] 参数列表 其中,选项的格式为: -a 或 --all:匹配所有选项 -b 或 --brief:简短模式,只输出短选项 -l 或 --longoptions:长选项 -o 或 --options:短选项 -n 或 --name:命令名称,一般不需要指定 -p 或 --shell:指定shell,一般不需要指定 -q 或 --quiet:安静模式,不输出错误信息 -r 或 --long-only:只支持长选项 -s 或 --silent:安静模式,不输出错误信息 -u 或 --unquoted:不转义引号 -- :结束选项列表,后面的参数都是非选项参数 使用getopt函数时,需要先定义一个选项字符串,选项字符串中包含了程序支持的所有选项,格式为“短选项字母:”,其中,短选项字母表示选项的名称,冒号表示该选项需要一个参数。例如,选项字符串“abc:def:”表示程序支持选项a、b、c、d、e、f,其中选项d和e需要一个参数。 然后,使用getopt函数进行解析,其基本的语法格式为: getopt [选项] 参数列表 其中,选项的格式为: -a 或 --all:匹配所有选项 -b 或 --brief:简短模式,只输出短选项 -l 或 --longoptions:长选项 -o 或 --options:短选项 -n 或 --name:命令名称,一般不需要指定 -p 或 --shell:指定shell,一般不需要指定 -q 或 --quiet:安静模式,不输出错误信息 -r 或 --long-only:只支持长选项 -s 或 --silent:安静模式,不输出错误信息 -u 或 --unquoted:不转义引号 -- :结束选项列表,后面的参数都是非选项参数 例如,下面的示例代码演示了如何使用getopt函数解析命令行参数: ``` #include <stdio.h> #include <stdlib.h> #include <getopt.h> int main(int argc, char **argv) { int opt; int aflag = 0, bflag = 0; char *cvalue = NULL; while ((opt = getopt(argc, argv, "abc:")) != -1) { switch (opt) { case 'a': aflag = 1; break; case 'b': bflag = 1; break; case 'c': cvalue = optarg; break; case '?': if (optopt == 'c') fprintf(stderr, "Option -%c requires an argument.\n", optopt); else if (isprint(optopt)) fprintf(stderr, "Unknown option `-%c'.\n", optopt); else fprintf(stderr, "Unknown option character `\\x%x'.\n", optopt); return 1; default: abort(); } } printf("aflag = %d, bflag = %d, cvalue = %s\n", aflag, bflag, cvalue); for (int index = optind; index < argc; index++) printf("Non-option argument %s\n", argv[index]); return 0; } ``` 在上面的示例代码中,选项字符串为“abc:”,表示程序支持选项a、b、c,其中选项c需要一个参数。然后,使用getopt函数解析命令行参数,将选项的值保存在变量中。最后,输出变量的值和非选项参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值