【问题标题】:Ruby Options parser not reading command line optionsRuby 选项解析器不读取命令行选项
【发布时间】:2013-05-16 13:26:39
【问题描述】:

我正在尝试使用 Ruby 内置选项解析器

我有这个文件

文件解析器.rb #!/usr/bin/env 红宝石 需要'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()

当我在没有参数的命令行上运行它时,它使用默认值: ./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?

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

【问题讨论】:

  • 感谢您的提示,我尝试更改脚本以遵循此答案,但这对我也不起作用。这是在我的脚本中修改的行: opts.on('-mID mID', '--msgID=mID', 'Message ID used by device') do |mID|但是我仍然在我的终端上得到相同的输出 msgID 仍然没有设置为传递给命令行参数的数字
  • 两个switch版本都不需要指定参数,一个就够了。另一方面,根据 OptParser 的性质,您不能将短开关名称定义为长于 one 字符(在破折号之后)。

标签: ruby parsing command-line-arguments options


【解决方案1】:

来自 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 时,您使用名为 ID 的参数定义了 switch -s - 这可能与您的预期不同。

【讨论】:

    【解决方案2】:

    似乎短开关必须是单个字符-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" 可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-28
      • 2010-10-28
      • 2015-01-15
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      相关资源
      最近更新 更多