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, ...)
这里不多做解释,更多详细的信息,可以查看源码。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
