3 回答

TA貢獻1850條經驗 獲得超11個贊
過去,在這些情況下,我增加了第二個選項。所以在你的例子中,-b。
-b [bvalue] If -a is enabled, ensure that it uses bvalue to thinginate.
如果第二個(可選)值充當標志,則它可以只是一個布爾標志。
如果第二個(可選)值是一些更任意的輸入,則第二個選項可以采用單個必需的參數。
雖然我相信你有理由把你的參數組織成,但它通常會導致一個更有用的命令行,無論如何都沒有這些多層的可選性(即選項中存在第二位可選值)。您可以將其視為兩級和三級嵌套菜單之間的UX差異。由于項目數量有限,兩級菜單通常更可用。(如果沒有更具體的用例細節,答案必須是泛泛而談的。-a reqdval optval

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

TA貢獻1784條經驗 獲得超8個贊
根據我對 appache-commons-cli 文檔的理解(我可能是錯的),似乎沒有辦法在每個參數的基礎上設置“可選Arg”。
另外,我看到它在示例中使用的方式,它似乎在兩者之間使用分隔符的參數,如in而不是空格?我不確定這一點。-D<property>=<value>
但是,是的,對于你想要的,你可以把它弄臟并允許可選參數,然后在選項沒有必需的參數時拒絕它(違背了我知道使用commons-cli的目的)。
編輯:您是否嘗試過使用模式選項生成器?這個例子引起了我的興趣:
例如,以下內容允許命令行標志為“-v -p 字符串值 -f /dir/文件”。感嘆號位于強制選項之前。
Options options = PatternOptionBuilder.parsePattern("vp:!f/");
它說感嘆號可以在強制選項之前使用,但我不確定它是否可以與強制參數一起使用?不過我沒有嘗試過。
添加回答
舉報