解析命令行选项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]=true

end


选项[:logfile]=无

opts.on('-l','--log FILE FILE','将日志写入文件')do | FILE |

选项[:logfile]=FILE

end


#这显示帮助屏幕,所有程序均

#假定具有此选项。

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对象上的方法。实际上这种方法有两种形式,parseparse!。正如感叹号所暗示的那样,它具有破坏性。它不仅解析命令行,还将删除从ARGV中找到的任何选项。这很重要,它将仅保留ARGV中选项后提供的文件列表。