使用Ruby中的OptionParse强制强制命令行参数

时间:2013-09-24 22:01:38

标签: ruby command-line-arguments optionparser

我有这段代码:

options = {}
opt_parse = OptionParser.new do |opts|
  opts.banner = "Usage: example.rb [options]"

  opts.on("-g", "--grade [N]", "Grade") do |g|
    options[:grade] = g
  end

  opts.on_tail("-h", "--help", "Show this message") do
    puts opts
    exit
  end

end
opt_parse.parse!

如何强制设置-g参数?如果未指定,则触发 usage 消息,如果调用了-h参数,则会显示消息。

1 个答案:

答案 0 :(得分:1)

OptionParser没有内置方法来检查强制选项。但解析后检查起来很容易:

if options[:grade].nil?
  abort(opt_parse.help)
end

如果您不想寻找任何过于复杂的事情,手动解析命令行相对容易:

# Naive error checking
abort('Usage: ' + $0 + ' site id ...') unless ARGV.length >= 2

# First item (site) is mandatory
site = ARGV.shift

ARGV.each do | id |
  # Do something interesting with each of the ids
end

但是当您的选项开始变得更复杂时,您可能需要使用选项解析器,例如,OptionParser

require 'optparse'

# The actual options will be stored in this hash
options = {}

# Set up the options you are looking for
optparse = OptionParser.new do |opts|
  opts.banner = "Usage: #{$0} -s NAME id ..."

  opts.on("-s", "--site NAME", "Site name") do |s|
    options[:site] = s
  end

  opts.on( '-h', '--help', 'Display this screen' ) do
    puts opts
    exit
  end
end

# The parse! method also removes any options it finds from ARGV.
optparse.parse!

这也是一种非破坏性的parse,但如果您计划使用ARGV中剩下的内容,那么它就没用了。

OptionParser类没有办法强制执行强制参数(例如在这种情况下为--site)。但是,您可以在运行parse!

后进行检查
# Slightly more sophisticated error checking
if options[:site].nil? or ARGV.length == 0
  abort(optparse.help)
end

有关更通用的强制选项处理程序,请参阅this answer。如果不清楚,除非您不加考虑,否则所有选项都是可选的。