Linux的GNU getopt:忽略未知的可选参数?

GNU getopt可以忽略未知的可选参数吗?

我有一个脚本scriptA.sh,它具有可选参数--optA, --optB, --optC, --optD

我想写一个包装wrapperA,带有两个可选的参数--optX and --optY ,调用scriptA 。 不过,我不想在包装器中声明scriptA的所有可选参数。

特别是,如果内部wrapperA ,我指定可选参数

 getopt --longoptions optX:,optY: 

电话

 wrapperA --optX --optA --optB 

返回一个错误

 getopt: unknown option -- optA 

GNU getopt可以被迫忽略未知的参数,并把它们放在“ – ”的输出之后吗?

不可能告诉GNU getopt忽略未知选项。 如果你真的想要这个功能,你将不得不编写你自己的选项解析器。

这并不像忽略未知选项那么简单。 你怎么知道一个未知的选项是否需要参数?

原始脚本的示例用法:

 originalscript --mode foo source 

这里foo是选项--mode一个参数。 而source是一个“非选项参数”(有时称为“位置参数”)。

包装脚本的示例用法:

 wrapperscript --with template --mode foo source 

wrapperscript中getopt如何知道它应该忽略--modefoo一起--mode ? 如果它忽略了--mode那么originalscript将获得foo作为第一个位置参数。

可能的解决方法是告诉包装脚本的用户在双短划线( -- )之后写入用于原始脚本的所有选项。 按照惯例,双破折号标志着期权的结束。 GNU getopt识别双破折号并停止解析,并将剩下的作为位置参数返回。

也可以看看:

我正在做一个类似的事情,并发现这个工作来阻止getopt错误从这些错误纠缠我。 基本上只是把错误遗忘。

 while getopts "i:s:" opt > /dev/null 2>&1; do case $opt in i) END=$OPTARG ;; esac done ./innerscript $* 

$ ./blah.sh -s 20140503 -i 3 -a -b -c