
如何使用 Apache Groovy 解析参数
我是 Apache Groovy 的忠实粉丝,它结合了 Python 和 Java 的优点。本系列文章旨在展示它可以为您做些什么。(如果您尚未安装 Groovy,请阅读简介。)
您还应该查看我的前两篇文章——一篇关于解析命令行选项,另一篇关于计算日期和时间范围。
在这里,我将更详细地探讨命令行参数处理。目标是开发一个可以有效执行日期范围计算的脚本。
通常有用的可重用脚本应该能够处理命令行选项和参数。
在 Linux 中,选项通常看起来像一个连字符后跟一个字符,通常(但并非总是)是一个字母。它们也可能看起来像两个连字符后跟一个单词。
例如,著名的 ls
命令接受参数 -a
或 --all
来列出目录中的所有文件,而不仅仅是“非隐藏”文件。
某些选项接受参数。例如,想象一下想要查看 man
命令的西班牙语手册页。
man --locale=es man
man
命令可以实现这一点。选项 --locale
的参数是 es
,表示西班牙语区域设置。
Groovy 内置了 CliBuilder 库。这有助于以一种非常 Groovy 的方式促进复杂的命令行处理。
这是处理计算两个日期之间差异的脚本大纲
1 def cli = new CliBuilder(usage: "between.groovy -[hws] start-date end-date")
2 cli.with {
3 h longOpt: 'help', 'Show usage info'
4 w longOpt: 'weekdays', 'Count week days (not weekends)'
5 s longOpt: 'statutory', args: 1, argName: 'statutory holidays file', 'List of dates and names of statutory holidays'
6 }
7 def options = cli.parse args
8 if (options.h) {
9 cli.usage()
10 } else {
11 def onlyWeekdays = options.w
12 def statHolidayFileName = options.s
13 if (options.arguments()?.size() == 2) {
14 def (startDateString, endDateString) = options.arguments()
15 println "onlyWeekdays? $onlyWeekdays"
16 if (statHolidayFileName) {
17 println "statHolidayFileName $statHolidayFileName"
18 }
19 println "start-date $startDateString"
20 println "end-date $endDateString"
21 } else {
22 cli.usage()
23 System.err.println "you must supply a start date and end date"
24 }
25 }
这是代码回顾
第一行初始化 CliBuilder
实例,给出用法字符串。
第二行到第六行使用 CliBuilder
定义的构建器领域特定语言 (DSL) 来定义选项
-h
(短格式)或--help
(长格式)——打印此脚本的帮助信息-w
(短格式)或--weekdays
(长格式)——仅计算日期之间的工作日,不包括周末-s
(短格式)或--statutory
(长格式)——接受一个参数,该参数将被解释为定义法定节假日的文件
构建器是非常棒的东西,Groovy 通过闭包、元编程和其他 Groovy 特性特别好地支持构建器。Groovy 已经准备好使用几个有用的构建器,包括 XML、JSON, 和 Swing(Java 的平台独立 GUI 支持)。但我今天不是来谈论构建器的。
第七行解析命令行。
第八行和第九行检查 -h
或 --help
是否存在,如果找到则打印用法命令。
第 11-12 行找出 -w
或 --weekdays
选项以及 -s
或 --statutory
选项及其参数,将 true
或 false
分配给 onlyWeekdays
变量,如果存在,则将参数的 String
值分配给 statHolidaysFileName
变量。
第 13-20 行处理提供两个参数的情况,假定为 start-date
和 end-date
。
第 14 行将 start-date
参数分配给变量 startDateString
,并将 end-date
参数分配给变量 endDateString
。这种特殊的 Groovy 语法允许从列表中紧凑且可读地定义和分配两个变量,而无需多个语句,也无需将列表解包到其元素中。
第 15-20 行代替了使用提供的选项和参数执行任何实际工作,只是简单地打印出来。请注意,在第 15 行,您使用了 Groovy 字符串插值(字符串中的 $onlyWeekdays
在执行时被替换为 onlyWeekdays
变量的当前值),在第 17、19 和 20 行也是如此。
第 21-23 行处理未提供参数或参数数量不是 2 的情况。表达式 options.arguments()?.size()
在没有参数时产生 false,并且仅在有参数时才调用 size() 函数。
结论
从这个不太简单的示例中可以看出,借助 CliBuilder,在 Groovy 中处理复杂的命令行选项和参数非常简单。还有其他很酷的 Groovy 特性,例如从列表进行多重赋值、闭包和领域特定语言支持。还值得一提的是,Groovy 脚本往往简洁易读,这使得长期运行中的支持更加容易。
这篇文章是 Apache Groovy 系列文章的一部分,敬请期待更多.
照片由 Jason Rosewell 拍摄于 Unsplash
留下评论