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 <unistd.h>
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的参数;两个冒号的就表示这个选项的参数是可选的,即可以有参数,也可以没有参数,但要注意有参数时,参数与选项之间不能有空格(有空格会报错的哦),这一点和一个冒号时是有区别的。

猜你喜欢

转载自www.cnblogs.com/franzz/p/9328673.html