Ruby中命名的命令行参数

时间:2010-12-15 12:37:30

标签: ruby

有没有办法将命名参数传递给Ruby脚本?

我理解传递参数的ARGV方法,但这要求它们按特定顺序排列。我想做的是传递命名参数,类似于其他命令行操作。例如:

$ ruby someRubyScript.rb -a argumentA -b argumentB

有什么想法吗?

6 个答案:

答案 0 :(得分:21)

有几种选择。

    标准库中的
  • OptionParser是最受欢迎的广告之一。它可以完全按照您的要求进行操作,API非常好。

  • GetOptLong也在标准库中,它重新实现了POSIX样式命令行。如果要模拟Unix命令行应用程序,可以执行所有操作。

  • Ara T. Howard的Main是创建命令行脚本的绝佳宝石。它超越了解析参数并创建自动使用和帮助提示,所有这些都有一个很好的DSL来指定命令行选项。

2014年更新

一些新的宝石已经普及:

  • Slop提供了一个非常简单的API,可以最大限度地减少使用OptionParser编写的代码量。

  • Highline在技术上不是命令行参数解析器,而是一种提示用户输入数据的方法,完成验证。这可以与上述之一结合使用,以提供完整的交互式CLI。

答案 1 :(得分:5)

您可以使用OptionParser轻松执行一些args解析。

require 'optparse'

hash_options = {}
OptionParser.new do |opts|
  opts.banner = "Usage: your_app [options]"
  opts.on('-a [ARG]', '--argument_a [ARG]', "Specify the argument_a") do |v|
    hash_options[:argument_a] = v
  end
  opts.on('-b [ARG]', '--argument_b [ARG]', "Specify the argument_b") do |v|
    hash_options[:argument_b] = v
  end
  opts.on('--version', 'Display the version') do 
    puts "VERSION"
    exit
  end
  opts.on('-h', '--help', 'Display this help') do 
    puts opts
    exit
  end
end.parse!

然后您的应用程序需要以:

启动
ruby application -a=12 -b=42 or
ruby application --argument_a=12 --argument_b=42

以下是文档:

http://www.ensta.fr/~diam/ruby/online/ruby-doc-stdlib/libdoc/optparse/rdoc/classes/OptionParser.html

答案 2 :(得分:2)

Ruby标准库附带GetOptLong,它可以做你想要的。

  

GetoptLong允许POSIX样式的选项,如-file以及单字母选项,如-f

答案 3 :(得分:2)

Trollop尚未被提及:特色,陈述性和紧凑性。虽然它显然可用作宝石,但您可以随时将其复制到项目中,因为它是一个(相对较小的)单个文件。

require 'trollop'
opts = Trollop::options do
  opt :monkey, "Use monkey mode"                     # flag --monkey, default false
  opt :goat, "Use goat mode", :default => true       # flag --goat, default true
  opt :num_limbs, "Number of limbs", :default => 4   # integer --num-limbs <i>, default to 4
  opt :num_thumbs, "Number of thumbs", :type => :int # integer --num-thumbs <i>, default nil
end
#=> {:monkey => false, :goat => true, :num_limbs => 4, :num_thumbs => nil}

答案 4 :(得分:1)

对于严肃的CLI应用程序,您可以使用https://github.com/wycats/thor

处提供的gem thor

答案 5 :(得分:0)

EasyOptions不需要解析代码:

## Usage: program [options]
##   --verbose, -v   Verbose mode
##   --logfile=NAME  Log filename

require 'easyoptions'

if EasyOptions.options[:verbose]
    puts EasyOptions.options[:logfile]
    puts EasyOptions.arguments[0]
end