2010-12-15 78 views
12

有沒有辦法將命名參數傳遞給Ruby腳本?Ruby中的命名行參數

我明白傳遞參數的ARGV方法,但這要求它們按照一定的順序。我想要做的是傳遞命名參數,類似於其他命令行操作。例如:

$ ruby someRubyScript.rb -a argumentA -b argumentB 

有什麼想法?

回答

19

有一對夫婦選擇單個字母的選項。

  • OptionParser,在標準庫中,是最流行的之一。它可以做到你想要的,而且API很好。

  • GetOptLong也在標準庫中,它重新實現了POSIX樣式的命令行。如果你想模擬一個Unix命令行應用程序,這可以做到這一切。

  • Ara T. Howard的Main是一款用於創建命令行腳本的漂亮寶石。它超越瞭解析參數,並創建自動使用和幫助提示,所有這些都有一個很好的DSL來指定命令行選項。

2014更新

幾個新的寶石已經上升到人氣:

  • Slop提供了一個極其簡單的API能最大限度地降低代碼量,你將不得不使用OptionParser寫。

  • Highline在技術上並不是一個命令行參數分析器,而是一種提示用戶輸入數據的方式,並帶有驗證。這可以與上述之一結合,以提供完整的交互式CLI。

+0

哦,很酷。謝謝,我會看看這些,他們聽起來很完美。 – Misterbenn 2010-12-15 13:11:53

+1

OptionParser的+1。 – 2010-12-17 04:39:51

5

您可以使用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

+0

我不認爲你把'='之間選項和論點。 – 2010-12-15 13:09:57

+1

@Mark Thomas,optparse在選項和它的值之間取一個空格,'='或者什麼也不做。在MRI 1.8.7中測試。 – 2010-12-15 14:32:35

2

Ruby的標準庫自帶GetOptLong應該做自己想。

GetoptLong允許像-file POSIX風格的選項,以及像-f

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} 
1

對於嚴重的CLI應用程序,您可以使用現有的寶石雷神在https://github.com/wycats/thor

+0

http://whatisthor.com現在可能是一個更好的網址。但是,是的,Thor +1。 – webmat 2014-01-15 17:59:03

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