有没有办法将命名参数传递给Ruby脚本?
我理解传递参数的ARGV方法,但这要求它们按特定顺序排列。我想做的是传递命名参数,类似于其他命令行操作。例如:
$ ruby someRubyScript.rb -a argumentA -b argumentB
有什么想法吗?
答案 0 :(得分:21)
有几种选择。
OptionParser是最受欢迎的广告之一。它可以完全按照您的要求进行操作,API非常好。
GetOptLong也在标准库中,它重新实现了POSIX样式命令行。如果要模拟Unix命令行应用程序,可以执行所有操作。
Ara T. Howard的Main是创建命令行脚本的绝佳宝石。它超越了解析参数并创建自动使用和帮助提示,所有这些都有一个很好的DSL来指定命令行选项。
2014年更新
一些新的宝石已经普及:
答案 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