为了账号安全,请及时绑定邮箱和手机立即绑定

定义一个同时具有强制参数和可选参数的选项

定义一个同时具有强制参数和可选参数的选项

慕码人2483693 2022-09-28 15:37:23
我目前正在尝试提出一种构建命令行选项的方法,该方法在提供时可以采用一个必需的参数或第二个可选参数(除了必需的参数之外)。我试图使用阿帕奇公地CLI来实现这一点。即我的程序 -a [整数]myProgram -a "test" --> isValid myProgram -a "test" 2 --> also isValid我试过:Option.builder("a").hasArg().numberOfArgs(2).optionalArg(true).build();&Option.builder("a").hasArg().numberOfArgs(2).build();这两者都没有按预期工作。第一个示例使两个参数都是可选的,它允许传递违反要求的空参数。第二个示例使这两个参数都成为必需参数,并且在仅提供字符串类型 arg 时失败。我已经查看了commons cli的文档,但他们提供的用例没有涉及像这样的复杂案例,同样也没有从api文档中获得太多细节。我希望程序在没有值的情况下提供 -a 时失败,但在提供 1 或 2 个参数时会成功,如前面所示。
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

过去,在这些情况下,我增加了第二个选项。所以在你的例子中,-b。

-b [bvalue]   If -a is enabled, ensure that it uses bvalue to thinginate.

如果第二个(可选)值充当标志,则它可以只是一个布尔标志。

如果第二个(可选)值是一些更任意的输入,则第二个选项可以采用单个必需的参数。

虽然我相信你有理由把你的参数组织成,但它通常会导致一个更有用的命令行,无论如何都没有这些多层的可选性(即选项中存在第二位可选值)。您可以将其视为两级和三级嵌套菜单之间的UX差异。由于项目数量有限,两级菜单通常更可用。(如果没有更具体的用例细节,答案必须是泛泛而谈的。-a reqdval optval


查看完整回答
反对 回复 2022-09-28
?
慕娘9325324

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


查看完整回答
反对 回复 2022-09-28
?
青春有我

TA贡献1784条经验 获得超8个赞

根据我对 appache-commons-cli 文档的理解(我可能是错的),似乎没有办法在每个参数的基础上设置“可选Arg”。

另外,我看到它在示例中使用的方式,它似乎在两者之间使用分隔符的参数,如in而不是空格?我不确定这一点。-D<property>=<value>

但是,是的,对于你想要的,你可以把它弄脏并允许可选参数,然后在选项没有必需的参数时拒绝它(违背了我知道使用commons-cli的目的)。

编辑:您是否尝试过使用模式选项生成器?这个例子引起了我的兴趣:

例如,以下内容允许命令行标志为“-v -p 字符串值 -f /dir/文件”。感叹号位于强制选项之前。

 Options options = PatternOptionBuilder.parsePattern("vp:!f/");

它说感叹号可以在强制选项之前使用,但我不确定它是否可以与强制参数一起使用?不过我没有尝试过。


查看完整回答
反对 回复 2022-09-28
  • 3 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号