1、短命令解析:代码
如何使用代码解析-a 123 -b 456?可以使用getopt函数。
1.1 原型:
int getopt(int argc, char * const argv[], const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
1.2 参数说明:
- optstring的格式
例:"ab:c::d::"
(1) 单个字符,表示该选项Option不需要参数。
(2) 单个字符后接一个冒号":"
,表示该选项Option需要一个选项参数Option argument。选项参数Option argument可以紧跟在选项Option之后,或者以空格隔开。选项参数Option argument的首地址赋给optarg。
(3) 单个字符后接两个冒号"::"
,表示该选项Option的选项参数Option argument是可选的。当提供了Option argument时,必须紧跟Option之后,不能以空格隔开,否则getopt()会认为该选项Option没有选项参数Option argument,optarg赋值为NULL。相反,提供了选项参数Option argument,则optarg指向Option argument。 - char *optarg
当匹配一个选项后,如果该选项带选项参数,则optarg指向选项参数字符串;若该选项不带选项参数,则optarg为NULL;若该选项的选项参数为可选时,optarg为NULL表明无选项参数,optarg不为NULL时则指向选项参数字符串。 - int optind
下一个待处理元素在argv中的索引值。即下一次调用getopt的时候,从optind存储的位置处开始扫描选项。当getopt()返回-1后,optind是argv中第一个Operands的索引值。optind的初始值为1。 - int opterr
opterr的值非0时,在getopt()遇到无法识别的选项,或者某个选项丢失选项参数的时候,getopt()会打印错误信息到标准错误输出。opterr值为0时,则不打印错误信息。 - int optopt
-在上述两种错误之一发生时,一般情况下getopt()会返回’?',并且将optopt赋值为发生错误的选项。
1.3 示例
#include <stdio.h>
#include <unistd.h>
const char *str = "ab:c::d::";
void parse_arg(int argc, char*argv[]){
int opt;
const char *str = "ab:c::d::";
printf("argc: %d\n", argc);
while ((opt = getopt(argc, argv, str)) != -1)
{
printf("opt:%c, optarg:%s, optind: %d\n", (char *)opt, optarg, optind);
}
}
int main(int argc, char *argv[])
{
printf("hello world\n");
parse_arg(argc, argv);
}
1.4 使用
PS Y:\work\Code\MyCode\getopt> .\getoptTest.exe -a -b host -ckeke -d haha
hello world
opt:a, optarg:(null), optind: 2
opt:b, optarg:host, optind: 4
opt:c, optarg:keke, optind: 5
opt:d, optarg:(null), optind: 6
2、短命令解析:shell
如何使用shell解析-a 123 -b 456?可以使用getopts指令。
2.1 命令示例
#!/bin/sh
#获取脚本参数
while getopts ":a:b:c::" opt;do
case $opt in
a)
echo "a: $OPTARG"
;;
b)
echo "b: $OPTARG"
;;
c)
echo "c: $OPTARG"
;;
*)
echo "Unsupport: $OPTARG"
;;
esac
done
2.2 使用
PS Y:\work\Code\MyCode\getopts> ./buildTest.sh -a 111 -b 222 -c 333 -d 444
a: 111
b: 222
c: 333
Unsupport: d