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如何知道它应该忽略--mode
和foo
一起--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