如何使用Ruby的optparse解析没有名称的参数

时间:2010-03-15 17:36:43

标签: ruby optparse

我需要解析像

这样的命令行
  script.rb <mandatory filename> [options]

optparse

当然我可以编写一些自定义代码来处理文件名,然后将ARGV传递给optparse,但也许有一种更简单的方法可以做到这一点?

编辑:还有另一种解析这样一个命令行的hacky方法,就是将['--mandatory-filename'] + ARGV传递给optparse,然后处理--mandatory-filename选项。

5 个答案:

答案 0 :(得分:45)

首先使用optparse parse!,然后扫描ARGV并在ARGV为空时进行提升。像这样:

op.parse!
filename = ARGV.pop
raise "Need to specify a file to process" unless filename

OptionParser不会处理强制性文件名,并且会在ARGV中留给您 - 如果不存在,只需手动提升。

答案 1 :(得分:9)

仅关注Julik和Shadowfirebird所说的内容:使用OptionParser进行分析时,请注意parse!parse具有不同的功能。前者将从传递的数组中删除它理解的每个参数,后者将离开它们。这会改变您确定所需参数是否存在的条件。

答案 2 :(得分:5)

虽然它不适用于所有情况,但能够在单个命令行上处理多个文件通常很好,例如:

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中唯一剩下的东西。

答案 3 :(得分:2)

我不确定它是否最近被添加,但之前的答案都没有提到126将在删除已解析的选项后返回ARGV值。

如果你这样做:

ErrorReceived

您将获得一个包含给定文件的数组(沿着未知选项)。这样,您无需关心选项是在文件之前还是之后。

答案 4 :(得分:0)

Optparse仅使用参数AFAIK进行参数。处理文件名的“正确”方法是在optparse之外处理它。我在回答this问题时发布了一些示例代码。

顺便说一下,这是一个相当不寻常的命令行。如果它只适合你,那很好,但其他人可能会发现它反直觉。拥有:script.rb [options] <filename> ......

更为正常