我在bash脚本中使用getopts
来解析参数。我想要做两件事:
- 从
"$@"
中移除已处理的选项 - 将未处理的选项保留在
"$@"
中
考虑命令行:
$ foo -a val_a -b val_b -c -d -e -f val_f positional_l positional_2 ...
当foo
使用getopts
来解析由'b:c'
定义的选项时,需要在后面将"$@"
留下。
`-a val_a -d -e -f val_f positional_l positional_2 ...`
我需要做两件事:
- 解析可能给出的一些选项
- 保留所有其他选项不变
这是因为foo
必须使用它识别的选项来确定另一个脚本bar
,并将剩余的"@"
传递给它。
通常情况下,getopts
在遇到未识别的选项时会停止,但我需要它继续(直到任何--
)。我需要处理和删除它识别的选项,并保留它不识别的选项。
我尝试使用--
在foo
选项和bar
选项之间解决我的问题,但如果--
后面的文本以-
开头,getopts
似乎会抛出错误(我尝试过但无法转义连字符)。
无论如何,我不想使用--
,因为我希望bar
的存在对foo
的调用者来说是有效透明的,并且我希望foo
的调用者能够以任何顺序提供选项。
我还尝试在foo
中列出所有的bar
选项(即使用'a:b:cdef:'
作为optstring),但不进行处理,但我需要删除它们在"$@"
中的位置。我无法弄清楚如何做到这一点(shift
不允许指定位置)。
我可以手动重构一个新的选项列表(请参阅我的答案),但我想知道是否有更好的方法来解决这个问题。
-a -b 3
,那么这是一个未知选项-a
后面没有参数,接着是预期的-b
选项,还是一个带有参数-b
的未知选项-a
,后面跟着一个位置参数3
? - chepner-ab
选项是-a
和选项参数b
,还是要解释为-a
和-b
的选项组? - mklement0