3 回答

TA贡献1850条经验 获得超11个赞
过去,在这些情况下,我增加了第二个选项。所以在你的例子中,-b。
-b [bvalue] If -a is enabled, ensure that it uses bvalue to thinginate.
如果第二个(可选)值充当标志,则它可以只是一个布尔标志。
如果第二个(可选)值是一些更任意的输入,则第二个选项可以采用单个必需的参数。
虽然我相信你有理由把你的参数组织成,但它通常会导致一个更有用的命令行,无论如何都没有这些多层的可选性(即选项中存在第二位可选值)。您可以将其视为两级和三级嵌套菜单之间的UX差异。由于项目数量有限,两级菜单通常更可用。(如果没有更具体的用例细节,答案必须是泛泛而谈的。-a reqdval optval

TA贡献1783条经验 获得超4个赞
所以你有一个选项,可以提供零个或一个时间,可以有一个或两个值?
final Options options = new Options() .addOption(Option.builder("a").hasArg().hasArgs().build());CommandLine cmd = new DefaultParser().parse(options, args); LOG.debug(Arrays.asList(args).toString() + " : " + Arrays.asList(cmd.getOptionValues("a")).toString());
DEBUG :: [-a, b] : [b] DEBUG :: [-a, b, c] : [b, c]
您可能希望在提供太多或太少的参数时引发自己的分析异常。
如果您想多次提供答案,请查看此答案:https://stackoverflow.com/a/64611857/8656281-a

TA贡献1784条经验 获得超8个赞
根据我对 appache-commons-cli 文档的理解(我可能是错的),似乎没有办法在每个参数的基础上设置“可选Arg”。
另外,我看到它在示例中使用的方式,它似乎在两者之间使用分隔符的参数,如in而不是空格?我不确定这一点。-D<property>=<value>
但是,是的,对于你想要的,你可以把它弄脏并允许可选参数,然后在选项没有必需的参数时拒绝它(违背了我知道使用commons-cli的目的)。
编辑:您是否尝试过使用模式选项生成器?这个例子引起了我的兴趣:
例如,以下内容允许命令行标志为“-v -p 字符串值 -f /dir/文件”。感叹号位于强制选项之前。
Options options = PatternOptionBuilder.parsePattern("vp:!f/");
它说感叹号可以在强制选项之前使用,但我不确定它是否可以与强制参数一起使用?不过我没有尝试过。
添加回答
举报