如何使用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] 是更为正常的…