busybox 中 getopt32用法

1. 函数原型

uint32_t getopt32(char **argv, const char *applet_opts, ...)

函数的声明位于libbb.h 中,定义在libbb/getopt32.c 中。

命令行选项是通过字符串applet_opts 传递。

如果其中一个选项被找到了, 就有一个标志值(unsigned long类型)添加到返回值中。

 

2. 返回值

标志值由字符在applet_opts种的位置决定, 例如:

flags = getopt32(argv, "rnug");
  • 如果发现选项  r  则加1(0 bit位 置1)
  • 如果发现选项  n 则加2(1 bit位 置1)
  • 如果发现选项  u 则加4(2 bit位 置1)
  • 如果发现选项  g 则加8(3 bit位 置1)

一个选项会设置一个bit 位,可以通过查看返回值的bit 值 确定是否有对应的选项。

 

3. 全局变量optind

在函数退出时,全局变量optind 会被设置,如果通过设置:

argc -= optind;
argv += optind;

那么,argc 就是剩下来非选项的参数,argv[0]为第一个非选项参数的值,argv[1]为第二个,以此类推。

例如,可执行文件为test,那么:

test -a 1 -b 2 -c 3

如果使用getopt32接口:

flags = getopt32(argv, "a:b:");

则可以通过:

char *pointer_to_arg_for_a;
char *pointer_to_arg_for_b;
char *pointer_to_arg_for_c;
char *pointer_to_arg_for_d;flags = getopt32(argv, "a:b:c:d:",&pointer_to_arg_for_a, &pointer_to_arg_for_b,&pointer_to_arg_for_c, &pointer_to_arg_for_d);

 

5. 符号“::”

如果选项有个可选参数,那么在applet_opts中的该选项字符后面加上“::”,而且提供一个指针存放该参数。

需要注意的是参数必须要紧跟选项字符:

-oparam

而不是:

-o param

 

6. 符号“:+”

如果选项字符后面是 ":+",那么意味着参数是一个非负的整数,参数会被函数 xatoi_positive()进行处理,得到的范围为0 ~ INT_MAX。

例如:

int param;
getopt32(argv, "p:+", ¶m);

 

7. 符号“:*”

选项字符后面加 ":*",那么意味着选项会被使用多次,每一个参数会被存放到 llist_t类型的元素,而不再是char *类型。

例如:

llist_t *patterns = NULL;
getopt32(argv, "e:*", &patterns);

命令行可以是:

$ grep -e user -e root /etc/passwd
root:x:0:0:root:/root:/bin/bash
user:x:500:500::/home/user:/bin/bash

 

8. 符号“+”

如果applet_opts 中的第一个字符为 “+”,那就argv数组中一旦遇上非选项字符就马上停止选项处理。

对于像env那样的applet就不会处理参数为子程序了:

env -i ls -d /

这里我们希望env仅仅处理 '-i' 不是 '-d'。

 

9. 符号“^”

options string is "^optchars""\0""opt_complementary".

选项字符串格式为:

"^optchars""\0""opt_complementary"

 

 

除了getopt32() 还有getopt32long()接口:

uint32_t getopt32long(char **argv, const char *applet_opts, const char *longopts, ...)

 这里不多做解释,更多详细的信息,可以查看源码。

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部