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

时间:2019-04-09 01:02:47

标签: java command-line-arguments command-line-parsing apache-commons-cli

我目前正在尝试构建一种命令行选项,该选项在提供时可以采用一个必需的参数或第二个可选参数(除了必需的参数)。我正在尝试使用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个参数时成功,如上所示。

3 个答案:

答案 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