Ruby Options解析器不读取命令行选项

时间:2013-05-21 17:14:13

标签: ruby parsing command-line-arguments options

我试图使用Ruby内置选项解析器

我有这个文件

File parser.rb      #!/ usr / bin / env ruby      要求'optparse'      要求'pp'

 class parser

 def initialize(args)
 @options = Hash.new()
 @op = OptionParser.new do |opts|
 @options[:verbose] = false
opts.on('-v', '--verbose', 'Output more information') do 
    @options[:verbose] = true
end

@options[:quick] = false
opts.on( '-q', '--quick', 'Perform the task quickly' ) do 
    @options[:quick] = true
end

@options[:logfile] = nil
opts.on( '-l', '--logfile FILE', 'Write log to FILE' ) do|file|
           @options[:logfile] = file
end

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

    @options[:sID] = "-1"
opts.on('-sID', '--senderID', 'Sender ID used by device') do |sID|
     @options[:sID] = sID
end

@options[:rID] = "-1"
opts.on('-rID', '--receiverID', 'Receiver ID used by device') do |rID|
    @options[:rID] = rID
end

  @op.parse!
  @op
  end

 def getOptionsHash
 @options
  end

然后我试图在下面的文件中使用这个类

 #!/usr/bin/env ruby

 # Setup Bundler
 require 'rubygems'
 require 'bundler/setup'

 require_relative 'parser'


 #Variables in the options hash in parser.rb

 op = Parser.new(ARGV)
 pp op.getOptionsHash()

当我在没有args的命令行上运行它时,它使用默认值:       ./push_test.rb

我得到以下输出:

 {:verbose=>false,
  :quick=>false,
   :logfile=>nil,
  :sID=>"-1",
  :rID=>"-1",

  }

当我在args的命令行上运行它时:       ./push_test.rb -sID“33”

我得到以下输出:

  {:verbose=>false,
   :quick=>false,
   :logfile=>nil,
  :sID=>"ID",
  :rID=>"-1",

  }

为什么sID没有设置为33?

任何人都可以帮忙吗?我试图解决这个问题,但不能取得任何进展

2 个答案:

答案 0 :(得分:1)

似乎短开关必须是单个字符-s

./push_test.rb -sID "33"

输出:

{:verbose=>false, :quick=>false, :logfile=>nil, :sID=>"ID", :rID=>"-1" }

因为-s到第一个空白区域后的所有内容都将分配给:sID,在您的情况下,“-s”后面的单词“ID”,因此您将获得:sID =>"ID"

./push_test.rb -s "33"可以解决问题。

答案 1 :(得分:0)

来自OptParser docs

Short style switch::   Specifies short style switch which takes a
mandatory, optional or no   argument. It's a string of the following
form:
  "-xMANDATORY"
  "-x[OPTIONAL]"
  "-x"

因此,在指定switch -sID时,您可以使用名为-s的参数定义switch ID - 这与您可能期望的不同。