boy singing on microphone with pop filter

如何使用 Apache Groovy 解析参数

这篇文章更详细地探讨了命令行参数处理。您将开发一个可以有效…
首页 » 博客 » 如何使用 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 已经准备好使用几个有用的构建器,包括 XMLJSON,Swing(Java 的平台独立 GUI 支持)。但我今天不是来谈论构建器的。

第七行解析命令行。

第八行和第九行检查 -h--help 是否存在,如果找到则打印用法命令。

第 11-12 行找出 -w--weekdays 选项以及 -s--statutory 选项及其参数,将 truefalse 分配给 onlyWeekdays 变量,如果存在,则将参数的 String 值分配给 statHolidaysFileName 变量。

第 13-20 行处理提供两个参数的情况,假定为 start-dateend-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

作者

留下评论

发表回复

如果您喜欢这篇文章,您可能也会喜欢这些