使用OptionParser解析Ruby中的命令

在讨论OptionParser's功能的文章中,我们讨论了使用Ruby中的OptionParser优于手动查看ARGV以手动解析命令的一些原因。现在它开始学习如何使用OptionParser及其功能。

以下boilerplate代码将用于本教程中的所有示例。要尝试任何示例,只需将示例'sopts.on 阻止TODO评论旁边。运行该程序将打印选项has和ARGV的状态,允许您检查开关的效果。

#!/usr/bin/env-ruby
require'optparse'
require'pp'
#此哈希将保留所有选项
#通过
#OptionParser从命令行解析。
options={}
optparse=OptionParser.newdo | opts |
#TODO:在此处放置命令行选项
#这显示帮助屏幕,所有程序
#假定都有此选项。
opts.on('-h','--help','显示此屏幕')do
放置opts
exit
end
end
#解析命令行。请记住,解析方法有两种形式
#。'parse'方法只是解析
#ARGV,而'解析!'方法解析ARGV并删除
ţ其中找到的任何选项,以及
#选项的任何参数。剩下的'是要调整大小的文件列表。
optparse.parse!
pp"选项:",选项
pp"ARGV:",ARGV

简单开关

一个简单的开关是一个没有可选表单或没有参数的参数。其效果是简单地在选项哈希中设置标志。没有其他参数将传递给on方法。

选项[:simple]=false
opts.on('-s','--simple',"simple-argement")do
选项[:simple]=true
结束

切换强制参数

采用标准的开关ameter只需要以开关的长形式说明参数名称。例如,&##34;-f","--file-file"表示-f或-file-switch采用单个称为file的参数,这个参数是强制性的。如果不同时传递参数,则不能使用-f或--file。

选项[:mand]=""
opts.on('-m','--强制性文件',"强制性参数")do | f |
选项[:mand]=f
结束

使用可选参数

切换

切换参数don't必须是强制性的,它们可以是可选的。要声明开关参数是可选的,请将其名称放在开关说明的括号中。例如,&##34;--logfile[FILE]"表示FILE参数是可选的。如果没有提供,程序将假定sane默认值,例如称为日志.

在该示例中,使用idioma=b | | c。这只是"a=b的简写,但如果b是假的或零,则a=c"。

选项[:opt]=false
opts.on('-o','--optional[OPT]',"可选参数")do | f |
选项[:OPT]=f | |"无"
结束

自动转换为Float

OptionParser可以自动将参数转换为某些类型。其中一种类型是Float。要自动将参数转换为switch To Float,请在开关描述字符串之后将Float传递给on方法。

自动转换很方便。他们不仅保存将字符串转换为所需类型的步骤,还检查您的格式,如果格式化不正确,将引发异常。

科普_1

选项[:float]=0.0
opts.on('-f','--float-NUM',float,"转换为float")do | f |
选项[:float]=f
结束

OptionParser可以转换为自动化的其他类型包括时间和整数。小常识

参数列表

参数可以解释为列表。当您转换为Float时,可以将其视为转换为数组。虽然您的选项字符串可以定义要调用的参数"a,b,c",但OptionParser会盲目地允许列表中的任何数量的元素。因此,如果您需要特定数量的元素,请务必自己检查阵列长度。

选项[:list]=[]
opts.on('-l','--list a,b,c',Array,"list of parameters")do | l |
options[:list]=l
end

一组参数

有时将论点限制在转向少数选择是有道理的。例如,以下开关将仅采用单个强制参数,并且参数必须是可能之一。如果该参数是其他任何参数,则将丢弃一个异常。

为此,在开关描述字符串之后将可接受的参数列表作为符号传递。

选项[:set]=:是
opts.on('-s','--set-OPT',[:yes,:no,:可能],"来自set")的参数do | s |
选项[:set]=s
结束

否定形式

交换机可以有否定的形式。开关-否定可以具有执行相反效果的开关,称为-无否定。要在开关描述字符串中描述这一点,请将替代部分放在括号中:-[no-]否定。如果遇到**个表单,则将true传递给块,如果遇到第二个表单,则将阻止false。

选项[:neg]=false
opts.on('-n','--[no-]否定',"否定形式")做| n |
选项[:neg]=n
结束