Определите параметр, который имеет как обязательный, так и необязательный аргумент - PullRequest
1 голос
/ 09 апреля 2019

В настоящее время я пытаюсь найти способ создания параметра командной строки, который при наличии может принимать либо один обязательный аргумент, либо второй необязательный аргумент (в дополнение к обязательному).Я пытаюсь добиться этого, используя 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.

Я просмотрел документацию для обыкновенных клиентов, но предоставленные ими варианты использования не затрагивали сложные случаи, подобные этой, и аналогичным образом не получили много подробностей из документации api.

Я ожидаю, что программа завершится ошибкой, когда -aпредоставляется без значения, но для успеха, если предоставляется 1 или 2 аргумента, как показано ранее.

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

В прошлом при этих обстоятельствах я добавлял второй вариант.Итак, в вашем примере -b.

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

Если ваше второе (необязательное) значение действует как флаг, оно может быть просто логическим флагом.

Если ваше второе (необязательное) значениеэто более произвольный ввод, второй параметр может принимать один обязательный аргумент.

Хотя я уверен, что у вас есть причины для организации ваших аргументов как -a reqdval optval, это часто приводит к более удобной командной строке, чтобы нев любом случае, иметь эти несколько уровней необязательности (т. е. наличие необязательного значения второго места внутри опции).Вы можете думать об этом как о разнице UX между двухуровневым и трехуровневым вложенным меню.С ограниченным количеством пунктов, двухуровневое меню часто более удобно.(И без более подробной информации о вашем случае использования ответы должны быть в общих чертах.)

0 голосов
/ 09 апреля 2019

Согласно моему пониманию документации для appache-commons-cli (и я могу ошибаться), похоже, не существует способа установить "AdditionalArg" для каждого аргумента.

Кроме того, как я вижу это в примерах, кажется, что он принимает аргументы с разделителями между ними, как в -D<property>=<value> вместо пробелов? Хотя я не уверен в этом.

Но, да, для того, что вы хотите, вы можете сделать это грязно и разрешить необязательные аргументы, а затем отклонить его, если у опции нет требуемого аргумента (победив цель использования commons-cli, я знаю).

РЕДАКТИРОВАТЬ: Вы пытались использовать PatternOptionBuilder ? Этот пример меня интригует:

Например, следующее разрешает флаги командной строки '-v -p строковое значение -f / dir / file '. Восклицательный знак предшествует обязательному опция.

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

В нем говорится, что восклицательный знак можно использовать перед обязательными параметрами, но я не уверен, что его можно использовать с обязательными аргументами? Я не пробовал это все же.

...