linux getopt源码,linux_c getopt命令

1.程序中为什么要使用getopt? 我们自己做一些if/else判断不是更简单么?

1) 使用getopt的意义在于提供更好的有益于理解的以及输入的帮助:

如我们常常使用的cp命令,实现目录的拷贝,无论使用cp -rf src dst还是cp src dst -rf,都可以实现目录拷贝的功能,这样

是不是更强大更兼容呢?

如我们常常使用的rm命令,实现删除的动作,所以我们习惯将rm -rf abc将-r -f选项合在一起,这样的实现是不是更方便呢?

如果我们常常使用的 e2fsck -c0,这样的实现是不是更容易理解呢?

2) 通常一个开源软件的移植性都是考虑得相当周全,在Linux平台下的开源软件,经常被移植到不同的平台,这就必须考虑到

不同平台的可移植性。此处借助于getopt更有益于可移植的考虑

2.getopt函数的作用

1) 排序功能

getopt会先将命令行参数进行排序,选项在前,命令在后,其中第0个参数始终是命令本身

排序规则:

只将有"-"选项与该选项的参数提到前面,剩下的依次放到后面,原有的参数顺序不会改变

举例说明:

cp src1/ src2/ -a src3/ -r dst/ 会排序为 cp -a -r src1/ src2/ src3/ dst/

e2fsck /dev/sda1 -c0 会排序为 e2fsck -c0 /dev/sda1

2) 参数解析

有些命令的选项后面会跟着一个参数,可以是数字,也可以是字母,或字符串,均可。

举例:

e2fsck /dev/sda1 -C0,这里-C选项的参数是0。也可以写成e2fsck /dev/sda1 -C 0,跟前面那句命令等价

3.getopt用法

#include

extern char *optarg;

extern int optind;

extern int opterr;

extern int optopt;

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

这里写个例子来说明(虚拟的): mycp -a -b hello -c123 src dst

char *optarg: -b的optarg是hello,-c的optarg是123,optarg就是选项后面跟着的参数;

int optind  : 下一个要处理的参数的下标(argv);

int opterr  : 如果将opterr设为0,则getopt不输出错误信息,否则报错,形如(e2fsck: invalid option -- 'x')

int optopt  : 当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt中

int getopt(int argc, char * const argv[], const char *optstring) : optstring看起来比较不清楚,待会儿看代码。该函数执行完或者失败返回-1.

argc和argv应该比较熟悉了,就是main函数的两个参与,用于保存参数个数和具体的参数。

optstring用户保存选项的。

while ((ch = getopt(argc, argv, "ab:c:de::")) != -1)

{

printf("optind: %d\n", optind);

switch (ch)

{

case 'a':

printf("HAVE option: -a\n\n");

break;

case 'b':

printf("HAVE option: -b\n");

printf("The argument of -b is %s\n\n", optarg);

break;

case 'c':

printf("HAVE option: -c\n");

printf("The argument of -c is %s\n\n", optarg);

break;

case 'd':

printf("HAVE option: -d\n");

break;

case 'e':

printf("HAVE option: -e\n");

printf("The argument of -e is %s\n\n", optarg);

break;

case '?':

printf("Unknown option: %c\n",(char)optopt);

break;

}

}

"a:b:cd::e",这就是一个选项字符串。对应到命令行就是-a ,-b ,-c ,-d, -e 。冒号又是什么呢? 冒号表示参数,一个冒号就表示这个选项后面必须带有参数(没有带参数会报错哦),但是这个参数可以和选项连在一起写,也可以用空格隔开,比如-a123 和-a   123(中间有空格) 都表示123是-a的参数;两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数,但要注意有参数时,参数与选项之间不能有空格(有空格会报错的哦),这一点和一个冒号时是有区别的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值