sti*_*vlo 4 groovy command-line-interface command-line-arguments command-line-parsing
我正在学习Groovy CliBuilder,我发现它很棒,除了,我不知道如何识别错误的论点.请考虑以下示例代码:
def cli = new CliBuilder()
cli.s args: 1, longOpt: 'sdkdir', 'sdkdir usage info'
cli.h args: 0, longOpt: 'help', 'print usage information'
def opt = cli.parse(args)
if (!opt) {
//how to be in this case? seems I can never reach here
println "something went wrong, but I don't know what"
} else if (opt.h) {
cli.usage()
} else (!opt.s) {
println "missing required option -s, try with --help for more information"
} else {
//do something
}
Run Code Online (Sandbox Code Playgroud)
例如,如果我用我的脚本调用-p
,这是一个无效的选项,没有任何反应.同样,如果我在选项后添加参数,也不会检测到它们.
如何检测并发出错误信号?
另外,一个小的不便是在我的例子中-s
是一个必需的参数,所以在理论上,我可以添加required: true
,在实践中我不能或它也将需要-h
,但我认为测试它是一个if
很好,除非有更好的方法.
我真正的问题是找到不需要的选项和参数.任何帮助表示感谢,谢谢.
更新:感谢@rodion的输入,我想我会很好地解决而不是为了简单而完美.这是我想出的:
#!/usr/bin/groovy
def cli = new CliBuilder(usage: 'cliTest -s sdkdir {projectName}',
header: 'Command line parameter parsing test in Groovy')
cli.s longOpt: 'sdkdir', args: 1, 'sdkdir usage info, REQUIRED'
cli.h longOpt: 'help', 'print usage information'
def opt = cli.parse(args)
def errMsg = "Invalid arguments.\nusage: ${cli.usage}\n" +
"Try `cliTest --help' for more information."
if (!opt) {
//should never happen, since I don't have required parameters in CliBuilder
println "error processing arguments\n"
} else if (opt.h) {
cli.usage()
} else if (!opt.s) {
println errMsg
} else if (opt.arguments().size() != 1) {
println errMsg
} else {
println "Creating project ${opt.arguments()[0]}, sdkdir ${opt.s.value}"
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案已经足够好了,但并不完美,因为它不会告诉您哪个参数有误,只是简单地告诉您消息或打印使用信息.以下是一些测试:
$ ./cliTest
Invalid arguments.
usage: cliTest -s sdkdir {projectName}
Try `cliTest --help' for more information.
$ ./cliTest -a
Invalid arguments.
usage: cliTest -s sdkdir {projectName}
Try `cliTest --help' for more information.
$ ./cliTest -a -s ../sdkdir
Invalid arguments.
usage: cliTest -s sdkdir {projectName}
Try `cliTest --help' for more information.
$ ./cliTest -s ../sdkdir
Invalid arguments.
usage: cliTest -s sdkdir {projectName}
Try `cliTest --help' for more information.
$ ./cliTest -s ../sdkdir projectName
Creating project projectName, sdkdir ../sdkdir
$ ./cliTest -s ../sdkdir projectName wrong
Invalid arguments.
usage: cliTest -s sdkdir {projectName}
Try `cliTest --help' for more information.
$ ./cliTest -s ../sdkdir -a projectName
Invalid arguments.
usage: cliTest -s sdkdir {projectName}
Try `cliTest --help' for more information.
$ ./cliTest -s
error: Missing argument for option: s
usage: cliTest -s sdkdir {projectName}
Command line parameter parsing test in Groovy
-h,--help print usage information
-s,--sdkdir <arg> sdkdir usage info, REQUIRED
error processing arguments
Run Code Online (Sandbox Code Playgroud)
为了我的目的,我非常满意,但如果有人知道更好的方式,请告诉我.
此外,我发现!opt
当有一个required: true
选项并且缺少参数时可能会发生这种情况,但根据我的理解,它永远不会被使用,因为否则不可能单独使用帮助选项.
小智 10
将groovy CliBuilder属性stopAtNonOption设置为false.(默认为true).我知道这似乎不直观.
CliBuilder cli = new CliBuilder(usage:'script-name',stopAtNonOption:false)
Run Code Online (Sandbox Code Playgroud)
然后,当您运行命令行应用程序时,CliBuilder会在遇到无法识别的选项时立即退出并显示错误消息,例如:
$ script-name -bad
error: Unrecognized option: -bad
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4849 次 |
最近记录: |