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

Leo*_*sov 31 ruby optparse

我需要解析一个命令行

  script.rb <mandatory filename> [options]
Run Code Online (Sandbox Code Playgroud)

optparse.

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

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

Jul*_*lik 47

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

op.parse!
filename = ARGV.pop
raise "Need to specify a file to process" unless filename
Run Code Online (Sandbox Code Playgroud)

强制性文件名将不会被处理,OptionParser并将在ARGV中留给您 - 如果它不在那里,只需手动提升.


小智 9

只是为了跟进Julik和Shadowfirebird所说的内容:解析时OptionParser要注意parse!parse具有不同的功能.前者将从传递的数组中删除它理解的每个参数,后者将离开它们.这会更改您确定所需参数是否存在的条件.


ada*_*mar 6

尽管它并不适用于所有情况,但是能够在单个命令行上处理多个文件通常很不错,例如:

script.rb [options] file1 file2 ...
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如果未提供文件,将显示帮助消息,并带有用法标语和选项说明。如果文件存在,它们将是ARGV中剩下的唯一内容。