`

Linux选项解释-getopt和getopt_long函数

阅读更多

Linux选项解释-getopt和getopt_long函数

一、命令行简介

解释分析命令行通常是所以程序的第一个任务,C语言通过argc和argv参数来访问它的命令行参数。

最简单的命令行处理技术可以通过if判断来表示,如下例:

if(argc>1 &&argv[1][0] ==  -  &&argv[1][1] ==  h )  //判断命令行参数是否为-n

{

     do _ some thing();

}

这样处理简单有序的命令行还可以,对于复杂的命令行处理显得有心无力,于是GNU提供两个函数专门用来处理命令行参数:getopt和getopt_long。

二、getopt函数

getopt()函数声明如下:

#include <unistd.h>

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

extern char *optarg;

extern int optind, opterr, optopt;
 

 

说 明:函数中的argc和argv通常直接从main()到两个参数传递而来。optsting是选项参数组成的字符串,如果该字符串里任一字母后有冒号, 那么这个选项就要求有参数,optarg就是选项参数。optind是当前索引,optopt用于当发现无效选项字符的时候,getopt函数或者返回 “?”或者返回“:”字符,并且optopt包含了所发现的无效选项字符。

如果optstring参数的第一个字符是冒号,那么getopt会根据错误情况返回不同的字符,当错误是无效选项,getopt返回“?”,当错误是缺少选项参数,getopt返回“:”。

注:GNU getopt()第三个特点是optstring中的选项字符后面接两个冒号,就允许该选项有可选的选项参数。在选项参数不存在的情况下,GNU getopt()返回选项字符并将optarg设置为NULL。

例子:

#include <stdio.h>

#include <unistd.h>

#include <getopt.h>

char *para = ":ab:c";

int main(int argc, char *argv[])

{

     int oc = -1;

     char *b_input = NULL;

     while((oc = getopt(argc, argv, para)) != -1)

     {

         switch(oc)

         {

          case 'a':

              printf("input para is a\n");

              break;

          case 'b':

              b_input = optarg;

              printf("input para is b,and optarg is %s\n", b_input);

              break;

          case 'c':

              printf("input para is c\n");

              break;

          case ':':

              printf("option %c requires an argument\n",optopt);

              break;

          case '?':

          default:

              printf("option %c is invalid:ignored\n",optopt);

             break;

         }

     }

     return 0;

}
 

 

编译:

[root@heguangwu projects]# gcc -o getopt_ex getopt_ex.c

运行:

[root@heguangwu projects]# ./getopt_ex -a

input para is a

[root@heguangwu projects]# ./getopt_ex -a -b

input para is a

option b requires an argument

[root@heguangwu projects]# ./getopt_ex -d

option d is invalid:ignored

 

三、getopt_long函数

getopt_long用来处理长选项,使用 man 3 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);
 

 

前三个参数与getopt相同,下一个参数是指向数组的指针,这个数组是option结构数组,option结构称为长选项表,其声明如下:

struct option
 {

    const char *name;

    int  has_arg;

    int  *flag;

    int  val;

};
 

 

结构中的元素解释如下:

const char *name :选项名,前面没有短横线

int has_arg:描述长选项是否有参数,其值见下表

符号常量

数值

含义

no_argument

required_argument

optional_argument

0

1

2

选项没有参数

选项需要参数

选项参数是可选的

int *flag

如果该指针为NULL,那么getopt_long返回val字段的值;

如果该指针不为NULL,那么会使得它所指向的结构填入val字段的值,同时getopt_long返回0

int val

如果flag是NULL,那么val通常是个字符常量,如果短选项和长选项一致,那么该字符就应该与optstring中出现的这个选项的参数相同;

 

 

#include <stdio.h>

#include <unistd.h>

#include <getopt.h>

char *para = ":ab:cf:v";

int do_all = 0;

int do_help = 0; 

int do_version = 0;

char *file = NULL;

struct option longopt[] = 

{

     {"all", no_argument, &do_all, 1},

     {"file", required_argument, NULL, 'f'},

     {"help", no_argument, &do_help, 1},

     {"version", no_argument, &do_version, 1},

     {"bob", required_argument, NULL, 'b'},

     {0, 0, 0, 0},

};

int main(int argc, char *argv[])

{

    int oc = -1;

    char *b_input = NULL;

    while((oc = getopt_long(argc, argv, para, longopt, NULL)) != -1)

    {

         switch(oc)

         {

         case 'a':

               printf("input para is a\n");

              break;

         case 'b':

              b_input = optarg;

              printf("input para is b,and optarg is %s\n", b_input);

             break;

        case 'c':

             printf("input para is c\n");

            break;

        case 'v':

            printf("input para is v\n");

            break;

        case 'f':

            printf("input para is f\n");

            file = "hello world";

            break;

        case 0:

           break;

        case ':':

             printf("option %c requires an argument\n",optopt);

             break;

         case '?':

         default:

            printf("option %c is invalid:ignored\n",optopt);

            break;

         }

     }

     printf("do_all is %d\n",do_all);

     printf("do_help is %d\n",do_help);

     printf("do_version is %d\n",do_version);

     printf("do_file is %s\n",file);

     printf("bob is %s\n", b_input);

     return 0;

}
 

 

 

执行的结果: 只显示关键结果

[root@heguangwu projects]# ./opt_ex2 -a

input para is a

 

[root@heguangwu projects]# ./opt_ex2 --all

do_all is 1

 

[root@heguangwu projects]# ./opt_ex2 -f h

input para is f

do_file is hello world

 

[root@heguangwu projects]# ./opt_ex2 --bob aa

input para is b,and optarg is aa

bob is aa

 

[root@heguangwu projects]# ./opt_ex2 -b aa

       input para is b,and optarg is aa

 

分享到:
评论

相关推荐

    getopt源码下载及getopt_long源码下载

    在Linux和Unix-like操作系统中,命令行参数的解析是一个常见的任务,`getopt`函数库提供了处理这种问题的标准方法。`getopt`是C语言中用于解析命令行选项的一个库函数,它允许程序以结构化的方式处理命令行参数。...

    getopt.h getopt.c getopt_long 文件和函数说明

    `getopt` 函数是C标准库的一部分,通常用于解析命令行参数,而`getopt_long` 是一个扩展功能,提供更方便的方式来处理长选项。 `getopt.h` 文件包含了 `getopt` 函数的声明。这个函数主要用于处理命令行参数,它...

    windows下的getopt/getopt_long等函数,vs2010实测可用

    GNU libc提供了getopt和getopt_long用于解析命令行参数,使用方便,但是windows环境没有提供。故将GNU libc提供的源码稍加修改,整理出了windows下可用的getopt和getopt_long。

    getopt.h getopt getopt_long

    win10 vs2019下的 getopt及getopt_long getopt/getopt_long函数是GNU C中的函数

    getopt.h getopt.c getopt getopt_long 字符串 命令行

    `getopt` 是一个库函数,用于解析程序启动时的命令行选项,而 `getopt_long` 是 `getopt` 的扩展版本,增加了对长选项的支持,使得命令行参数的使用更加灵活和易读。 `getopt.h` 是头文件,包含了 `getopt` 函数的...

    getopt和getopt_long在Linux操作系统下解析命令

    `getopt`和`getopt_long`函数是C语言标准库中用于解析命令行参数的两个重要工具,它们能帮助我们方便地获取和处理用户在执行程序时传递的参数。 `getopt`函数是最基础的命令行参数解析函数,它按照一定的顺序(通常...

    linux解析命令行选项getopt_long用法解读.docx

    Linux中的`getopt_long`函数是用来解析命令行选项的一个标准工具,它可以帮助程序员方便地处理命令行参数。本文将深入探讨`getopt_long`的用法及其相关知识点。 首先,`getopt_long`函数通常在编写需要处理命令行...

    getopt及getopt_long.rar

    在Linux系统编程中,`getopt`和`getopt_long`是两个非常重要的命令行选项解析函数,它们帮助开发者处理程序启动时的命令行参数。这两个函数由GNU C库提供,广泛应用于各种C语言编写的命令行工具和应用程序中。在...

    c-getopt-long 使用手册

    在C编程中,`getopt()` 和 `getopt_long()` 是两个非常重要的函数,用于解析命令行选项。它们主要用于处理程序启动时用户输入的一系列参数,例如 `-h`(帮助)或 `-o`(带有参数的选项)。这些函数是C标准库的一部分...

    详细解析命令行的getopt_long()函数

    getopt_long支持长选项的命令行解析,函数中的参数argc和argv通常直接从main()的两个参数传递而来。optstring是选项参数组成的字符串。 字符串optstring可以下列元素: 1. 单个字符,表示选项, 2. 单个字符后接一个...

    getopt多参数解析函数具体分析命令行参数解析

    `getopt()`函数是C语言中用于解析命令行参数的标准函数,主要应用于Unix/Linux系统,也可以在其他支持C语言的环境中使用。它简化了对带有选项和参数的命令行输入的处理,使得程序能够优雅地解析和理解用户提供的...

    在linux下的getopt源码

    在Linux系统中,getopt是一个常用的命令行参数解析函数,广泛应用于各种命令行工具和脚本。这个函数允许程序员按照标准格式处理命令行参数,使得程序的参数化更加灵活和标准化。getopt函数的源代码对于理解其工作...

    11-getopt.rar

    在Linux和UNIX系统中,命令行参数的处理是程序设计中的一个重要部分,`getopt`函数就是用于这个目的的关键工具。这个"11-getopt.rar"压缩包很可能包含的是一个关于`getopt`函数的源码副本或者示例程序,供学习者理解...

    pure-getopt:在纯Bash中实现的GNU getopt的直接替代

    纯Bash实现的GNU getopt是Linux和Unix系统中命令行参数解析的一种解决方案。在Linux环境中,getopt函数通常用于解析命令行选项,它遵循POSIX标准,并在C语言中实现。然而,`pure-getopt`项目提供了一个完全用Bash...

    Command Line Options: getopt_long() Learning Note

    在Linux和Unix-like操作系统中,命令行选项是程序接收参数的一种常见方式,它们通常以短格式(如`-a`)或长格式(如`--option`)出现。`getopt_long()`函数是GNU C库提供的一种处理命令行选项的工具,特别适合于解析...

    Go-getopt(3)-风格的Goflag解析器

    `getopt(3)`是Unix和类Unix系统中用于解析命令行选项的一个函数,它允许程序在处理参数时识别带有短划线(-)或双短划线(--)[1]的选项,并可以接受选项后的值。`Go-getopt`库在Go中实现了类似的功能,为Go开发者提供了...

    基于mjpg-streamer-r63的源码分析之:基础知识详细解释[二].pdf

    Linux系统提供了许多函数用于解析命令行参数,其中getopt_long函数和getopt_long_only函数是较为常用的两个函数。这两个函数的作用是帮助程序员处理输入的命令行参数,并解析出程序需要的参数值。本文将详细介绍...

    getopt windows实现

    在Windows操作系统中,通常开发环境使用的是MSVC (Microsoft Visual C++) 或者其他与Windows API紧密集成的工具,而这些工具并不直接支持Linux中的`getopt`、`getopt_long`和`getopt_long_only`函数。这些函数是用于...

Global site tag (gtag.js) - Google Analytics