linux 中解析命令行参数

本文介绍如何使用Getopt和Getopt_long函数解析Linux命令行参数,包括短选项和长选项的定义规则及示例程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用Getopt在Linux下获取命令行参数的方法

 用Getopt在Linux下获取命令行参数的方法 [摘要] 如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错信息,则只要将全域变opterr设为0即可。
[关键字]  Getopt Linux 命令行 参数  1、函数说明 

  表头文件:#include 

  函数声明:int getopt(int argc, char * const argv[], const char *optstring); 

  函数说明:getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。此函数会返回在argv 中下一个的选项字母,此字母会对应参数optstring 中的字母。如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg 即会指向此额外参数。如果getopt()找不到符合的参数则会印出错信息,并将全域变量optopt设为“?”字符,如果不希望getopt()印出错信息,则只要将全域变opterr设为0即可。 

  选项的使用定义规则类似: 

  ab:c:: 

  意思是: 

  a 后没有冒号,表示没有可以参数 

  b 后跟一个冒号,表示有一个必要的参数 

  c 后跟两个冒号,表示有一个可选的参数 

  长选项的定义相同,但用逗号分割。 

  返回值:如果找到符合的参数则返回此参数字母,如果参数不包含在参数optstring 的选项字母则返回“?”字符,分析结束则返回-1。 

  2、例子程序 

  下面是一个使用getopt函数读取参数的例子程序,该程序支持 –p –s –b –c的参数,并将这些参数值读取后进行打印。你可以根据需要将这些代码稍作修改用于自己的程序中。 

  /* 

  * getopt.c 

  * Author: Coonxu 

  * email: coonxu@126.com 

  * 这是一个使用getopt函数读取参数的例子程序,该程序支持 -p -s -b -c的参数, 

  * 并将这些参数值读取后进行打印。你可以根据需要将这些代码稍作修改用于自己的程序中。 

  */ 

  #include 

  #include 

  int main(int argc, char **argv) 

  { 

  int ch; 

  opterr = 0; 

  while( ( ch = getopt( argc, argv, "s:b:c:p:" ) ) != EOF ) 

  { 

  switch(ch) 

  { 

  case 's': 

  printf("s opt: %s\n", optarg); 

  break; 

  case 'b': 

  printf("b opt: %s\n", optarg); 

  break; 

  case 'c': 

  printf("c opt: %s\n", optarg); 

  break; 

  case 'p': 

  printf("p opt: %s\n", optarg); 

  break; 

  case '?': 

  printf( "illegal option: %c\n", ch ); 

  break; 

  } 

  }  来自:  http://hi.baidu.com/freedom%5Fasic/blog/item/b9146e0ac85d9e39b0351d47.html


getopt_long支持长选项的命令行解析,使用man 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);

说明:函数中的argc和argv通常直接从main()到两个参数传递而来。optsting是选项参数组成的字符串,如

果该字符串里任一字母后有冒号,那么这个选项就要求有参数。下一个参数是指向数组的指针,这个数组是

option结构数组,option结构称为长选项表,其声明如下:

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

结构中的元素解释如下:
const char *name:选项名,前面没有短横线。譬如"help"、"verbose"之类。
int has_arg:描述长选项是否有选项参数,如果有,是哪种类型的参数,其值见下表:
符号常量             数值            含义
no_argument            0            选项没有参数
required_argument      1            选项需要参数
optional_argument      2            选项参数是可选的
int *flag:
如果该指针为NULL,那么getopt_long返回val字段的值;
如果该指针不为NULL,那么会使得它所指向的结构填入val字段的值,同时getopt_long返回0
int val:
如果flag是NULL,那么val通常是个字符常量,如果短选项和长选项一致,那么该字符就应该与optstring中

出现的这个选项的参数相同;

最后一个参数:longindex参数一般赋为NULL即可;如果没有设置为NULL,那么它就指向一个变量,这个变量

会被赋值为寻找到的长选项在longopts中的索引值,这可以用于错误诊断。

注:GNU提供的getopt-long()和getopt-long-only()函数,其中,后者的长选项字串是以一个短横线开始的

,而非一对短横线。


linux 命令行约定:
     几乎所有的GNU/Linux程序都遵循一些命令行参数定义的约定。程序希望出现的参数可以分成两种:选

项(options or flags)、其他类型的的参数。Options修饰了程序运行的方式,其他类型的参数则提供了输

入(例如,输入文件的名称)。

     对于options类型参数可以有两种方式:
     1)短选项(short options):顾名思义,就是短小参数。它们通常包含一个连字号和一个字母(大写

或小写字母)。例如:-s,-h等。
     2)长选项(long options):长选项,包含了两个连字号和一些大小写字母组成的单词。例如,--

size,--help等。
     *注:一个程序通常会提供包括short options和long options两种参数形式的参数。

     对于其他类型参数的说明:
     这种类型的参数,通常跟随在options类型参数之后。例如,ls –s /功能为显示root目录的大小。’/

’这个参数告诉ls要显示目录的路径。


getopt_long()函数使用规则:

(1)使用前准备两种数据结构
    字符指针型变量
    该数据结构包括了所有要定义的短选项,每一个选项都只用单个字母表示。如果该选项需要参数(如,

需要文件路径等),则其后跟一个冒号。例如,三个短选项分别为‘-h’‘-o’‘-v’,其中-o需要参数,

其他两个不需要参数。那么,我们可以将数据结构定义成如下形式:
const char * const shor_options = “ho:v” ;

    struct option 类型数组
    该数据结构中的每个元素对应了一个长选项,并且每个元素是由四个域组成。通常情况下,可以按以下

规则使用。第一个元素,描述长选项的名称;第二个选项,代表该选项是否需要跟着参数,需要参数则为1,

反之为0;第三个选项,可以赋为NULL;第四个选项,是该长选项对应的短选项名称。另外,数据结构的最后

一个元素,要求所有域的内容均为0,即{NULL,0,NULL,0}。下面举例说明,还是按照短选项为‘-h’‘-o’

‘-v’的例子,该数据结构可以定义成如下形式:
const struct option long_options = {
{  “help”,      0,   NULL,   ‘h’  },
{  “output”,    1,   NULL,   ‘o’  },
{  “verbose”,   0,   NULL,   ‘v’  },
{  NULL,      0,    NULL,   0  }
};

(2)调用方法
     参照(1)准备的两个数据结构,则调用方式可为:
getopt_long( argc, argv, short_options, long_options, NULL);

(3)几种常见返回值
    (a)每次调用该函数,它都会分析一个选项,并且返回它的短选项,如果分析完毕,即已经没有选项了,

则会返回-1。
    (b)如果getopt_long()在分析选项时,遇到一个没有定义过的选项,则返回值为‘?’,此时,程序员可

以打印出所定义命令行的使用信息给用户。
    (c)当处理一个带参数的选项时,全局变量optarg会指向它的参数
    (d)当函数分析完所有参数时,全局变量optind(into argv)会指向第一个‘非选项’的位置

实践小例子:


 

[c-sharp]  view plain copy
  1. #include <stdio.h>  
  2. #include <getopt.h>  
  3. char *l_opt_arg;  
  4. charconst short_options = "nbl:";  
  5. struct option long_options[] = {  
  6.      { "name",     0,   NULL,    'n'     },  
  7.      { "bf_name",  0,   NULL,    'b'     },  
  8.      { "love",     1,   NULL,    'l'     },  
  9.      {      0,     0,     0,     0},  
  10. };  
  11. int main(int argc, char *argv[])  
  12. {  
  13.      int c;  
  14.      while((c = getopt_long (argc, argv, short_options, long_options, NULL)) != -1)  
  15.      {  
  16.          switch (c)  
  17.          {  
  18.          case 'n':  
  19.              printf("My name is XL./n");  
  20.              break;  
  21.          case 'b':  
  22.              printf("His name is ST./n");  
  23.              break;  
  24.          case 'l':  
  25.              l_opt_arg = optarg;  
  26.              printf("Our love is %s!/n", l_opt_arg);  
  27.              break;  
  28.          }  
  29.      }  
  30.      return 0;  
  31. }  

编译并运行:

[root@localhost liuxltest]# gcc -o getopt getopt.c

[root@localhost liuxltest]# ./getopt -n -b -l forever
My name is XL.
His name is ST.
Our love is forever!
[root@localhost liuxltest]#

[root@localhost liuxltest]# ./getopt -nb -l forever
My name is XL.
His name is ST.
Our love is forever!
[root@localhost liuxltest]# ./getopt -nbl forever  
My name is XL.
His name is ST.
Our love is forever!

<think>好的,我现在需要帮助用户了解Linux命令行参数的使用方法和示例。首先,我得回顾一下用户提供的引用内容,看看有哪些相关的知识点可以整合进来。用户提到了getopt、getopt_long以及shell脚本中的参数处理,比如getopts和手动解析的方法。首先,我应该分步骤介绍不同的方法,比如C语言中的getopt和getopt_long,以及shell脚本中的处理方式。这样结构会比较清晰。用户可能需要基础的示例,所以每个部分都需要提供代码片段,并解释每个参数的作用。 然后,要注意引用内容的标注,比如在讲解getopt时引用[^2],在讨论长选项时引用[^1],以及在shell脚本部分引用[^3]和[^4]。需要确保引用标识自然添加在相关段落的末尾,不要遗漏。接下来,用户可能需要知道如何区分短选项和长选项,如何处理带参数的选项,以及如何捕获非选项参数。因此,每个示例都应该涵盖这些情况。例如,在C语言的示例中,可以展示如何解析-a、-b和带参数的-c选项,同时处理非选项参数。在shell脚本部分,可以展示如何处理-v和-p选项,并获取参数值。 另外,用户可能对性能或最佳实践感兴趣,但根据问题,主要焦点是使用方法和示例。不过,生成相关问题的时候,可以考虑包括优化方法或常见错误,这样能帮助用户深入理解。最后,需要确保所有代码示例符合格式要求,使用正确的LaTeX语法,比如行内公式用$...$,独立公式用$$...$$。不过在这个问题中,可能涉及代码较多,数学公式较少,但如果有数学表达式出现,要正确应用格式。总结一下,回答的结构应该是:1.命令行参数的基本概念2.C语言中的处理方法(getopt和getopt_long)3.Shell脚本中的处理方法(getopts和手动解析)4.每个部分提供示例代码和解释5.相关问题部分生成与命令行参数相关的问题,如性能分析、错误处理等现在需要检查每个引用内容是否被正确利用,并确保示例代码的正确性。例如,引用[3]提到getopts的使用方法,可以在shell脚本部分详细说明。引用[4]中的手动解析方法也是一个好的补充,适合不需要复杂处理的场景。可能还需要注意用户提到的“想了解使用方法或相关知识”,所以除了示例,还需要简要说明何时选择哪种方法,比如简单脚本用getopts,复杂需求用getopt_long等。 最后,生成的相关问题要围绕命令行参数的使用,比如如何解析长选项、如何处理未知参数、如何组织多参数命令等,这样用户可以有进一步学习的路径。</think>### Linux命令行参数使用方法详解 #### 一、命令行参数基础概念 在Linux中,命令行参数分为两种类型: 1. **短选项**:单字母参数,例如`-v`,`-h`,通常用`getopt`或`getopts`解析[^2][^3] 2. **长选项**:多字母参数,例如`--version`,`--help`,需用`getopt_long`解析[^1] #### 二、C语言处理方法 ##### 1. getopt函数(短选项) ```c #include <unistd.h> int main(int argc, char *argv[]) { int opt; while ((opt = getopt(argc, argv, "abc:")) != -1) { switch (opt) { case 'a': printf("选项a被设置\n"); break; case 'b': printf("选项b被设置\n"); break; case 'c': printf("选项c的参数值: %s\n", optarg); break; default: exit(1); } } // 处理非选项参数 for (int i = optind; i < argc; i++) printf("非选项参数: %s\n", argv[i]); return 0; } ``` * `"abc:"`表示接受`-a`、`-b`和带参数的`-c`选项[^2] * `optind`变量记录非选项参数的起始位置[^2] ##### 2. getopt_long函数(长选项) ```c #include <getopt.h> static struct option long_options[] = { {"version", no_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; int main(int argc, char *argv[]) { int opt; while ((opt = getopt_long(argc, argv, "vh", long_options, NULL)) != -1) { switch (opt) { case 'v': printf("版本信息\n"); break; case 'h': printf("帮助文档\n"); break; } } return 0; } ``` * 支持同时解析`-v`和`--version`[^1] * `struct option`定义长选项映射关系[^1] #### 三、Shell脚本处理方法 ##### 1. getopts内置命令 ```bash #!/bin/bash while getopts ":a:bc" opt; do case $opt in a) echo "选项a参数: $OPTARG";; b) echo "选项b被设置";; c) echo "选项c被设置";; \?) echo "无效选项: -$OPTARG";; esac done ``` * `:`表示选项需要参数(如`a:`)[^3] * `OPTARG`变量存储选项参数值[^3] ##### 2. 手动解析(适合简单场景) ```bash #!/bin/bash while [ -n "$1" ]; do case "$1" in -v|--version) shift version="$1" ;; -p) ppt_mode=true ;; *) echo "未知参数: $1" exit 1 ;; esac shift done ``` * 通过`shift`移动参数位置[^4] * 支持混合解析短/长选项[^4] #### 四、典型应用示例 ```bash # 带参数的短选项 $ program -c config.txt -v # 长选项与位置参数混合使用 $ program --input=data.txt output.log # 组合短选项 $ program -abc # 等价于 -a -b -c ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值