【发布时间】:2016-10-17 14:01:43
【问题描述】:
我正在使用getopts 解析bash 脚本中的参数。我想做两件事:
- 从
"$@"中删除已处理的选项 - 在
"$@"中保留未处理的选项
考虑命令行
$ foo -a val_a -b val_b -c -d -e -f val_f positional_l positional_2 ...
其中foo 使用getopts 解析由'b:c' 的optstring 定义的选项,然后需要将"$@" 保留为
`-a val_a -d -e -f val_f positional_l positional_2 ...`
我需要做两件事:
- 解析可能给出的选项子集
- 保留所有其他选项不变
这是因为foo 必须使用它识别的选项来确定另一个脚本bar,它必须将剩余的"@" 传递给该脚本。
通常getopts 在遇到无法识别的选项时会停止,但我需要它继续(直到任何--)。我需要它来处理并删除它识别的选项,而不管那些它不识别的选项。
我确实尝试在foo 选项和bar 选项之间使用-- 解决我的问题,但如果-- 后面的文本以- 开头,getopts 似乎会出现问题(我试过但无法逃脱连字符)。
无论如何,我宁愿不必使用--,因为我希望bar 的存在对foo 的调用者有效,并且我希望foo 的调用者能够以任何顺序显示选项。
我还尝试在foo 中列出所有baroptions(即使用'a:b:cdef:'作为optstring)而不处理它们,但我需要从"$@" 中删除已处理的选项,因为它们发生。我不知道该怎么做(shift 不允许指定位置)。
我可以手动重建一个新的选项列表(请参阅我自己的答案),但我想知道是否有更好的方法来做到这一点。
【问题讨论】:
-
一个(看似无法克服的)问题:如果你看到
-a -b 3,那是一个未知选项-a,没有参数,后跟预期的-b选项,还是未知选项@987654354 @ 带有参数-b后跟位置参数3? -
@chepner:好点。另一个问题:是
-ab选项-a带有选项参数b,还是一个选项组被解释为-a和-b? -
这看起来更不可逾越:)