2014-07-11 50 views
7

是否有可能使用GNU getopt忽略未知的可选参数?linux 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被迫忽略未知参数并将它们放在' - '后面的输出中?

回答

5

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

这并不像忽略未知选项那么简单。你怎么知道一个未知的选项是否需要论证?原始脚本的

用法示例:

originalscript --mode foo source 

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

用法示例:

wrapperscript --with template --mode foo source 

wrapperscript如何getopt说明知道它应该忽略--modefoo在一起吗?如果它忽略--mode那么originalscript将得到foo作为第一位置参数。

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

参见:

+0

谢谢您的答复。双破折号终止选项列表将在我的情况下工作。至于忽略未知选项,我明白你的观点 - 它并不像看起来那么容易。我最初的想法是推出所有未知选项 - 在getopt输出( - with template - mode foo source)中。但是,只有在后续的参数处理交给原始记录时,这才会起作用。正如你所说,wrapperscript无法知道originalscript的参数是否带有参数。 – user3830744

+0

有一个类似的问题,双破折号作为魅力。 –

2

我工作的一个类似的事情,发现这个工作从这些错误缠着我停止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

+0

**如果缺少参数采用“OPTARG”**,则会中断。 https://gist.github.com/cirosantilli/2a803442add75e0f1e164cde183999d3 GNU Bash 4.3.48。 –

+0

如果无效选项在*有效期之前被*传递,这也会中断。 – trysis