Linux命令行参数处理——getopt系列函数

本文详细介绍了Linux系统中处理命令行参数的getopt和getopt_long函数,包括它们的原型、工作原理、参数解析规则以及示例。通过getopt函数,可以解析短选项,而getopt_long不仅支持短选项,还支持长选项,提供更灵活的参数处理方式。文章还探讨了如何处理选项参数、选项字符、选项字符串以及错误处理等情况。
摘要由CSDN通过智能技术生成

  版权声明:本文参考了《Linux man pages》。。未经作者允许,严禁用于商业出版,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!


1 getopt

原型

#include <unistd.h>
int getopt(int argc, char * const argv[],const char *optstring);

extern char *optarg;
extern int optind, opterr, optopt;

描述

getopt解析命令行参数。它的参数argc和argv是在程序调用时传递给main()函数的参数计数和数组。

参数argc它是程序启动时传递给main()函数的参数。argc为传入程序的参数的个数,默认为1,代表程序自身。

参数argv是程序启动时传递给main()函数的参数。argv是一个指针数组,用来存放命令行参数。传入的命令行参数以空白符(包括空格符,制表符,换行符)分界,并以字符串的形式存放在指针数组argv中,argv数组的每个元素存放一个字符串指针,指向一个传入的命令行参数。

-(而不是"_“或”–")开头的argv元素就是一个选项元素。“-”叫做选项标识符。选项标识符后面可以紧跟一个字符,这个字符叫做选项字符。选项字符后面可以紧跟一个或多个字符,这些字符叫做选项参数

也就是说一个选项元素包括选项标识符、选项字符、选项参数三部分,其中选项字符和选项的参数是可选的,如果有选项字符则必须紧跟在标识符后,选项参数根据规则不同可以紧跟在标识符后面,也可以与选项字符用空白符分开。如:命令行"app.exe -abc -d",此时argc为3,argv[0]为“app.exe”,argv[1] 为 “-abc”,argv[2] 为 “-d”。其中“a”是第一个选项字符,“bc”为选项参数,“d”是第二选项字符,没有选项参数。如果重复调用getopt(),它依次返回每个选项元素的选项字符。在前面的例子中第一次返回“a”,第二次返回“d”。

默认情况下,getopt()在每次调用时会重新排列argv数组中除了argv[0]之外的元素,最终这些元素中所有既不是选项(无论合不合法)也不是选项参数的元素都会排到argv数组末尾。这样argv数组中除argv[0]之外的元素分为与选项有关和与选项无关两类。但类内元素的相对顺序并不会变。例如,opstring为“a🅱️cd::e:”,命令行为"app.exe test0 -a test1 test2 -b test3",那么argv的最后会变成"-a test1 -b test3 test0 test2"

调用getopt时,getopt会依次扫描optind及其以后的元素,期待找到一个选项元素:

  • 如果getopt()找到一个由opstring规定的合法选项元素,则返回它的选项字符,置optopt为0,并设置外部变量optind为下一个要扫描的元素下标,同时更新静态变量nextchar,以便下次调用时能够继续扫描后面的选项字符或元素。
  • 如果找不到选项元素(无论其选项字符是否合法,只要有,就算有选项元素),getopt()返回-1,并将optarg置为null。在这种情况下:
    • 如果argv中,除了argv[0]之外,没有与选项无关的元素,则optind就置为argc。
    • 否则,则将optind置为第一个与选项无关的元素的下标。

特殊元素“–”强制结束选项扫描,无论扫描模式如何。

参数optstring是合法选项的字符串,比如:“a🅱️cd::e”,这就是一个选项字符串。对应到命令行就是-a ,-b ,-c ,-d, -e 。规则如下:

  • 如果选项字符后跟一个冒号,就表示这个选项后面必须带有参数(没有带选项参数会报错,然后将optarg置为null,optopt置为该选项字符,且返回’?’),getopt将指向同一个选项元素中的选项参数或下一个argv元素的指针放入optarg中,也就是说这个参数可以和选项连在一起写(此时optarg指向同一个同一个选项元素中的选项参数),也可以用空白符隔开(此时optarg指向下一个argv元素),比如app.exe -a123app.exe -a 123(中间有空格)都表示123是-a的参数。特别地,如果漏写选项参数,且它不是最后一个argv元素,则无论下一个元素是什么都将视为该选项字符的选项参数。例如opstring为“a🅱️cd::e:”,命令行为app.exe -a -b-b会被作为a的参数。

  • 如果选项字符后跟两个冒号,就表示这个选项可以有参数,也可以没有参数,但要注意有参数时,选项字符与选项参数之间不能有空格(若有空格,则认为该选项不带参数),这一点和一个冒号时是有区别的。这是一个GNU才有的扩展功能。

  • 不带冒号的表示这个选项没有参数。如果命令行参数中此选项字符之后紧跟其他字符,则会被作为选项字符处理。

  • 如果optstring的第一个字符为“+”或设置了环境变量POSIXLY_CORRECT,则一旦遇到非选项也非选项参数的元素,就认为没有更多选项存在了。

  • 如果optstring的第一个字符为’-’,那么每个非选项也非选项参数的argv元素都将被处理为ASCII为1的选项字符的参数。(这被用于编写可以以任何顺序使用选项"-1"和其他argv元素,并且关心两者的顺序的程序。)。

  • 如果optstring包含W;,则-W foo被视为长选项--foo。(-W选项由POSIX.2保留,用于实现扩展。)此行为是GNU才有的扩展功能,在glibc 2之前的库中不可用。

外部变量optind是要argv数组中将要被扫描的下一个元素的下标。系统将该值初始化为1,因为索引0就是程序的名,调用者可以将其重置为1,以重新扫描argv数组,或扫描新的参数向量。

  • 如果选项字符与参数写在一起,则optind为下一个元素的下标(即使该元素不存在,或为与选项无关的元素)。
  • 如果选项字符与参数用空白符号分开,则optind为选项参数的下一个元素的下标(即使该元素不存在,或为与选项无关的元素)。

外部变量optarg 是用来保存选项的参数的;初始值为NULL。如果选项(不论是否合法)无参数,则置为NULL。

外部变量oprerr

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝月心语

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值