有沒有辦法將命名參數傳遞給Ruby腳本?Ruby中的命名行參數
我明白傳遞參數的ARGV方法,但這要求它們按照一定的順序。我想要做的是傳遞命名參數,類似於其他命令行操作。例如:
$ ruby someRubyScript.rb -a argumentA -b argumentB
有什麼想法?
有沒有辦法將命名參數傳遞給Ruby腳本?Ruby中的命名行參數
我明白傳遞參數的ARGV方法,但這要求它們按照一定的順序。我想要做的是傳遞命名參數,類似於其他命令行操作。例如:
$ ruby someRubyScript.rb -a argumentA -b argumentB
有什麼想法?
有一對夫婦選擇單個字母的選項。
OptionParser,在標準庫中,是最流行的之一。它可以做到你想要的,而且API很好。
GetOptLong也在標準庫中,它重新實現了POSIX樣式的命令行。如果你想模擬一個Unix命令行應用程序,這可以做到這一切。
Ara T. Howard的Main是一款用於創建命令行腳本的漂亮寶石。它超越瞭解析參數,並創建自動使用和幫助提示,所有這些都有一個很好的DSL來指定命令行選項。
2014更新
幾個新的寶石已經上升到人氣:
您可以使用OptionParser輕鬆執行一些參數解析。
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
我不認爲你把'='之間選項和論點。 – 2010-12-15 13:09:57
@Mark Thomas,optparse在選項和它的值之間取一個空格,'='或者什麼也不做。在MRI 1.8.7中測試。 – 2010-12-15 14:32:35
Ruby的標準庫自帶GetOptLong應該做自己想。
GetoptLong允許像-file POSIX風格的選項,以及像-f
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}
對於嚴重的CLI應用程序,您可以使用現有的寶石雷神在https://github.com/wycats/thor
http://whatisthor.com現在可能是一個更好的網址。但是,是的,Thor +1。 – webmat 2014-01-15 17:59:03
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
哦,很酷。謝謝,我會看看這些,他們聽起來很完美。 – Misterbenn 2010-12-15 13:11:53
OptionParser的+1。 – 2010-12-17 04:39:51