如何使用Ruby的optparse解析没有名称的参数
我需要解析一个命令行
script.rb [options]
用optparse 。
当然我可以编写一些自定义代码来处理文件名,然后将ARGV
传递给optparse,但也许有一种更简单的方法可以做到这一点?
编辑:还有另一种解析这样一个命令行的hacky方法,那就是将['--mandatory-filename'] + ARGV
传递给optparse,然后处理--mandatory-filename
选项。
先parse!
使用optparse,然后扫描ARGV并在ARGV为空时加注。 像这样:
op.parse! filename = ARGV.pop raise "Need to specify a file to process" unless filename
OptionParser
不会处理强制性文件名,并且会在ARGV中为您保留 – 如果不存在,只需手动提升。
只是为了跟进Julik和Shadowfirebird说的话:用OptionParser
解析时要注意parse!
和parse
具有不同的function。 前者将从传递的数组中删除它理解的每个参数,后者将离开它们。 这会更改您确定所需参数是否存在的条件。
虽然它不适用于所有情况,但能够在单个命令行上处理多个文件通常很好,例如:
script.rb [options] file1 file2 ...
file1是必需的,但file2及更高版本是可选的。
我知道这样做的最好方法遵循以下惯例:
options = {} optparse = OptionParser.new do |opts| opts.banner = "Usage: script.rb [options] file1 file2 ..." opts.on('-a', '--an-option ARG', 'Set some option') do |arg| options[:a] = arg end ... end optparse.parse! # Check required conditions if ARGV.empty? puts optparse exit(-1) end
如果未提供文件,将显示帮助消息,其中包含使用横幅和选项说明。 如果文件存在,它们将是ARGV中唯一剩下的东西。
我不确定它是否是最近添加的,但之前的答案都没有提到optparse.parse
会在删除已解析的选项后返回ARGV值。
如果你这样做:
rest = optparse.parse!
您将获得一个包含给定文件的数组(沿着未知选项)。 这样您就不必关心选项是在文件之前还是之后。
Optparse仅使用参数AFAIK进行参数。 处理文件名的“正确”方法是在optparse之外处理它。 我在回答这个问题时发布了一些示例代码。
BTW,这是一个相当不寻常的命令行。 如果它只适合你,那很好,但其他人可能会觉得它反直觉。 拥有: script.rb [options]
是更为正常的…