簡體   English   中英

定義一個具有強制和可選參數的選項

[英]Define an option that has both a mandatory and optional argument

我目前正試圖想出一種方法來構建一個命令行選項,當提供該選項時,可以采用一個必需參數或第二個可選參數(除了必需參數)。 我正在嘗試使用 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 個參數時會成功,如前面所示。

根據我對 appache-commons-cli 文檔的理解(我可能是錯的),似乎沒有辦法在每個參數的基礎上設置“optionalArg”。

同樣,我在示例中看到它的使用方式,似乎在參數之間使用分隔符,如-D<property>=<value>而不是空格? 我不確定這一點。

但是,是的,對於你想要的,你可以做臟並允許可選參數,然后在選項沒有必需的參數時拒絕它(破壞了我知道使用 commons-cli 的目的)。

編輯:您是否嘗試使用PatternOptionBuilder 這個例子讓我很感興趣:

例如,以下允許'-v -p string-value -f /dir/file'的命令行標志。 感嘆號位於強制選項之前。

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

它說感嘆號可以在強制選項之前使用,但我不確定它是否可以與強制參數一起使用? 不過我沒試過。

過去,在這些情況下,我添加了第二個選項。 所以在你的例子中,-b。

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

如果您的第二個(可選)值充當標志,則它可以只是一個布爾標志。

如果您的第二個(可選)值是一些更任意的輸入,則第二個選項可以采用單個必需參數。

盡管我確信您有理由將參數組織為-a reqdval optval ,但它通常會導致更有用的命令行無論如何都沒有這些多層可選性(即選項中存在第二個可選值) . 您可以將其視為兩級和三級嵌套菜單之間的 UX 差異。 由於項目數量有限,兩級菜單通常更有用。 (如果沒有更具體的用例細節,答案必須是一般性的。)

所以你有一個可以提供零次或一次的選項,並且可以有一個或兩個值?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM