解析命令行选项Ruby方式(OptionParser)
Ruby配备了强大而灵活的工具来解析命令行选项OptionParser。一旦你学会了如何使用它,你永远不会回到手动查看ARGV。OptionParser具有许多功能,使其对Ruby程序员非常有吸引力。如果您'使用Ruby或C手动解析选项,或使用getoptlongC函数,您'将会看到其中一些更改有多受欢迎。
- OptionParser是干燥的。您只需编写命令行开关,其参数,遇到时要运行的代码'以及脚本中一次的命令行开关描述。OptionParser将自动从此描述中为您生成帮助屏幕,并从其描述中推断出有关参数的所有信息。例如,它会知道-file[file]选项是可选的,只需要一个参数。此外,它会知道-[-no]-verbose实际上是两个选项,将接受两种形式。
- OptionParser将自动将选项转换为特定类。如果选项采用整数,它可以将在命令行上传递的任何字符串转换为整数。这减少了解析命令行选项所涉及的一些繁琐内容。
- 一切都非常包含。所有选项都在同一位置,选项的效果是右侧是选项的定义。如果必须添加,更改选项或有人只想查看他们的工作,则只有一个地方可以查看。解析命令行后,单个哈希或OpenStruct将保留结果。
已经足够了,向我显示一些代码
所以这里'是如何使用OptionParser的简单例子。它不使用任何**功能,只是基础知识。有三个选项,其中一个选项有一个参数。所有选项都是强制性的。有-v/--verbose和-q/--quick选项,以及-l/-logfile FILE选项。此外,脚本还采用独立于选项的文件列表。
#!/usr/bin/env ruby
#一个脚本,假装调整多个图像
require'optparse'
#此哈希将保存所有选项
#从命令行解析
#OptionParser。
选项={}
optparse=OptionParser.newdo | opts |
#设置横幅,显示在帮助屏幕的顶部
#。
opts.banner="用法:optparse1.rb[选项]文件1文件2…"
#定义选项,以及他们做的
选项[:verbose]=false
opts.on('-v','--verbose','输出更多信息')做
选项[:verbose]=true
end
选项[:quick]=false
opts.on('-q','--quick','快速执行任务')do 111>选项[:quick]=trueend选项[:logfile]=无opts.on('-l','--log FILE FILE','将日志写入文件')do | FILE |选项[:logfile]=FILEend#这显示帮助屏幕,所有程序均#假定具有此选项。opts.on('-h健康知识手抄报图片大全','--help','显示此屏幕')do放置opts退出结束结束#解析命令行。请记住,解析方法有两种形式#。'解析'方法只是解析#ARGV,而'解析!'方法解析ARGV并删除ţ在那里找到的任何选项,以及
的任何参数#选项。剩下的'是要调整大小的文件列表。optparse.parse!输入"逐字#34;如果选项[:verbose]输入\35;#34;快速&35;#34;如果选项[:快速]输入\\35;#34;登录到文件35>
ARGV.each做| f |
放置"调整图像#{f}…"
睡眠0.5
结束
检查代码
首先,需要optparse库。请记住,这不是'宝石。它带有红宝石,所以在optparse之前不需要安装宝石或需要rubygems。
这个脚本中有两个有趣的对象。**个是选项,在最上面的范围内声明。它'一个简单的空散列。定义选项时,它们将默认值写入此哈希。例如,默认行为是此脚本not为verbose,因此选项[:verbose]设置为false。当在命令行上遇到选项时,它们会更改选项中的值以反映其效果。例如,当遇到-v/-verbose时,它将为选项[:verbose]分配true。
第二个有趣的对象是optparse。这是OptionParser对象本身。构建此对象时,将其传递一个块。该块在构建过程中运行,并将在内部数据结构中构建选项列表,并准备好解析所有内容。它'在这个区块中,所有的魔术都发生了。您在这里定义所有选项。
定义选项
每个选项遵循相同的模式。您首先将默认值写入哈希中。一旦构建了OptionParser,就会发生这种情况。接下来,你打电话给254在方法上,它定义了选项本身。这种方法有几种形式,但这里只使用一种。其他表单允许您定义一个选项仅限于的自动类型转换和值集。这里使用的三个参数是选项的简短形式,长形式和描述。
on方法将从长形式推断出许多东西。有一件事会推断出任何参数的存在。如果选项中存在任何参数,它将把它们作为参数传递给块。
如果在命令行上遇到该选项,则运行传递给on方法的块。在这里,块不会'做得很多,它们只是在选项哈希中设置值。可以做更多的工作,例如检查引用的文件是否存在等。如果有任何错误,可以从这些块中投掷异常。
最后,解析命令行。这是通过调用解析发生的!OptionParser对象上的方法。实际上这种方法有两种形式,parse和parse!。正如感叹号所暗示的那样,它具有破坏性。它不仅解析命令行,还将删除从ARGV中找到的任何选项。这很重要,它将仅保留ARGV中选项后提供的文件列表。