Ruby中的命令行选项解析

时间:2014-07-15 11:51:48

标签: ruby linux unix command-line-arguments optparse

我有一个ruby脚本,它解析给它的命令行选项,如下所示:

#!/usr/bin/ruby

require 'optparse'

puts 'Hello World!, This is my first ruby program'

options = {}

optparse = OptionParser.new do|opts|

  opts.banner = "Featbuild minimal trial script for command line parsing"

  options[:cpl] = nil
  opts.on('-cpl SWITCH_STATE', 'compile on or off') do|cplopt|
      options[:cpl] = cplopt
      OPT_CPL=cplopt
      puts cplopt
  end

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

optparse.parse!

output = open("mypipe", "w+")

output.puts OPT_CPL
#output.flush

现在上面脚本中的行opts.on('-cpl SWITCH_STATE', 'compile on or off') do|cplopt|是我遇到问题的地方。

我相信我们可以通过以下方式实现这一目标: 1。)opts.on('--cpl SWITCH_STATE', 'compile on or off') do|cplopt| 2)opts.on('-c', '--cpl SWITCH_STATE', 'compile on or off') do|cplopt| 3)opts.on('-cpl SWITCH_STATE', 'compile on or off') do|cplopt|

这是我传递的有效论据:

$./try1.rb --cpl on
$./try1.rb -c on

这不起作用:     <。/ try1.rb -cpl on

Ruby,而不是'on'作为选项参数,得到'pl',就像指定了$./try.rb -c pl一样。

我希望解析字符串$./try1.rb -cpl on,以便将'on'传递给opts.on()中方法'cplopt'的块。

我指的是这个教程:http://ruby.about.com/od/advancedruby/a/optionparser2.htm

似乎'-cpl on'在Ruby中是不可能的?是这样吗?

我可以在这里申请哪些其他替代解决方案?

2 个答案:

答案 0 :(得分:1)

尝试Trollop,因为它使选项解析生活更轻松。

require 'trollop'
opts = Trollop::options do
  version "compile 0.1.0"
  banner  "Usage: compile <option> - where [options] are:"
  opt     :cpl,  "compile on or off",  :type => :string,  :default => "off"
end
puts opts.cpl

运行时,结果为:

$ ruby ./trollop.rb --cpl on
on

$ ruby ./trollop.rb --cpl off
off

$ ruby ./trollop.rb -c on
on

$ ruby ./trollop.rb -c off
off

$ ruby ./trollop.rb
off


Trollop 2.0支持no- negation of boolean options,您可能会发现它比处理on/off字符串更容易。

opt "cpl", "Compile", :default => true

运行时,结果为:

$ ruby trollop.rb --cpl
true

$ ruby trollop.rb --no-cpl
false

答案 1 :(得分:1)

我认为您需要确保只有cp1在单引号中而不是

  

-cpl SWITCH_STATE

DO

 opts.on('-cpl', 'compile on or off') do|cplopt|
  options[:cpl] = cplopt
  OPT_CPL=cplopt
  puts cplopt
 end

以下是一个例子:

opts.on('-s', '--size 1G or 1024M', '1G or 1024M') do |s|
    options[:size] = s;
end