我目前正在尝试构建一种命令行选项,该选项在提供时可以采用一个必需的参数或第二个可选参数(除了必需的参数)。我正在尝试使用apache commons cli来实现这一目标。
即myProgram -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个参数时成功,如上所示。
答案 0 :(得分:0)
根据我对appache-commons-cli文档的理解(我可能是错的),似乎没有一种方法可以针对每个参数设置“ optionalArg”。
以我在示例中使用它的方式来看,似乎采用了带有分隔符的参数,例如-D<property>=<value>
中的空格而不是空格?不过我不确定。
但是,是的,对于您想要的,您可以对其进行脏污处理并允许使用可选参数,然后在该选项没有必需参数时拒绝它(违反了我所知道的使用commons-cli的目的)。
编辑:您尝试使用PatternOptionBuilder吗?这个例子吸引了我:
例如,以下允许命令行标志为'-v -p 字符串值-f / dir / file”。感叹号在强制性命令之前 选项。
Options options = PatternOptionBuilder.parsePattern("vp:!f/");
它说惊叹号可以在强制选项之前使用,但是我不确定是否可以将其与强制参数一起使用?我没有尝试过。
答案 1 :(得分:0)
过去,在这种情况下,我添加了第二个选项。因此,在您的示例中-b。
-b [bvalue] If -a is enabled, ensure that it uses bvalue to thinginate.
如果您的第二个(可选)值充当标志,则可以只是一个布尔标志。
如果您的第二个(可选)值是更多任意输入,则该第二个选项可以采用单个必需参数。
尽管我确定您有理由将您的参数组织为-a reqdval optval
,但是这通常会导致更有用的命令行始终没有这些多层可选性(即存在第二个可选值)在一个选项中)。您可以将其视为两级和三级嵌套菜单之间的UX差异。由于项目数量有限,二级菜单通常更有用。 (并且如果没有用例的更多详细信息,答案必须是笼统的。)
答案 2 :(得分:0)
那么您有一个选项可以提供零次或一次,并且可以有一个或两个值?
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]
当提供过多或过少的参数时,您可能想引发自己的解析异常。
如果您想多次提供-a
,请查看以下答案:https://stackoverflow.com/a/64611857/8656281