簡體   English   中英

Ruby中命名的命令行參數

[英]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年更新

一些新的寶石已經上升到流行:

  • Slop提供了一個非常簡單的API,可以最大限度地減少使用OptionParser編寫的代碼量。

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

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM