[英]Named command line arguments in Ruby
有沒有辦法將命名參數傳遞給Ruby腳本?
我理解傳遞參數的ARGV方法,但這需要它們按特定順序。 我想做的是傳遞命名參數,類似於其他命令行操作。 例如:
$ ruby someRubyScript.rb -a argumentA -b argumentB
有什么想法嗎?
有幾種選擇。
標准庫中的OptionParser是最受歡迎的選項之一。 它可以完全按照您的要求進行操作,API非常好。
GetOptLong也在標准庫中,它重新實現了POSIX樣式的命令行。 如果要模擬Unix命令行應用程序,可以執行所有操作。
Ara T. Howard's Main是創建命令行腳本的絕佳寶石。 它超越了解析參數並創建自動使用和幫助提示,所有這些都有一個很好的DSL來指定命令行選項。
2014年更新
一些新的寶石已經上升到流行:
您可以使用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
Ruby標准庫附帶了GetOptLong ,它可以做你想要的。
GetoptLong允許POSIX樣式的選項,如-file以及單字母選項,如-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上提供的gem thor
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.