没有参数的OptionParser显示横幅

时间:2013-12-16 06:22:20

标签: ruby optionparser

我在Ruby中使用OptionParser

我其他语言如C,Python等,有类似的命令行参数解析器,它们通常提供一种在没有提供参数或参数错误时显示帮助消息的方法。

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

  opts.on("-l", "--length L", Integer, "Length") { |l| options[:length] = l }
  opts.on("-w", "--width W", Integer, "Width") { |w| options[:width] = w }

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

问题

  1. 如果没有传递参数(help),有没有办法设置默认显示ruby calc.rb消息?
  2. 如果未给出必需参数或无效,该怎么办?假设length是一个REQUIRED参数,用户没有传递它或传递错误,如-l FOO

3 个答案:

答案 0 :(得分:34)

只需将 -h 键添加到 ARGV ,当它为空时,您可以执行以下操作:

require 'optparse'

ARGV << '-h' if ARGV.empty?

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

  opts.on("-l", "--length L", Integer, "Length") { |l| options[:length] = l }
  opts.on("-w", "--width W", Integer, "Width") { |w| options[:width] = w }

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

答案 1 :(得分:0)

我的脚本正好需要 2 个参数,因此我在解析后使用此代码检查 ARGV.length

if ARGV.length != 2 then
  puts optparse.help
  exit 1
end

答案 2 :(得分:-2)

  1. 您可以在解析之前检查ARGV(如上面的答案):
    ARGV << '-h' if ARGV.empty?

    或者在解析后检查你的选项哈希:

    if @options.empty?
      puts optparse.help
      puts 'At least 1 argument should be supplied!'
    end
    
  2. 我这样做是为了确保使用OptionParse的强制args(找不到任何内置功能):

    begin
      optparse.parse!
      mandatory = [:length, :width]                                         # Enforce the presence of
      missing = mandatory.select{ |param| @options[param].nil? }            # mandatory switches: :length, :width
      if not missing.empty?                                                 #
            puts "Missing options: #{missing.join(', ')}"                   #
            puts optparse.help                                              #
            exit 2                                                          #
      end                                                                   #
    rescue OptionParser::InvalidOption, OptionParser::MissingArgument => error     #
      puts error                                                                   # Friendly output when parsing fails
      puts optparse                                                                #
      exit 2                                                                       #
    end