2015-12-22 43 views
1

我剛剛開始使用用於Ruby的OptionParser,並且我想使用不僅僅使用一個參數的標誌。使用OptionParser在Ruby中解析多個命令行選項

舉例來說,我想能夠運行:

script --move src dst 

注意如何srcdst沒有使用昏迷分離。

我最初的想法是:

opts.on("-m src dst", "--move src dst ", "move file from SRCto DST") do |src| 
    # do something 
end 

但是,這是行不通的。我認爲這不是正確的做法。但是,這怎麼可能呢?

+0

在標題爲「生成幫助」下的文檔http://ruby-doc.org/stdlib-2.2.4/libdoc/optparse/rdoc/OptionParser.html中有一個非常好的示例,該示例顯示如何接受調用的參數'name'。同樣可以擴展你的'src'和'dst'的情況。您需要重複顯示'name'的示例 - 一次輸入'src',一次輸入'dst'作爲兩個單獨的'opts.on'語句 –

+2

OP特別要求如何接受同一個選項的兩個連續值。 –

回答

2

OptionParser不支持;它可以修補,但我不確定這是否值得麻煩。

考慮以下代碼:

require 'optparse' 

options = {} 
OptionParser.new do |opt| 
    opt.on('-m', '--move') { |o| options[:move] = o } 
end.parse! 

from_name, to_name = ARGV 

puts "Should move: #{ options.key?(:move) }" 
puts "From: #{ from_name }" 
puts "To: #{ to_name }" 

保存它,並與參數的各種組合運行它返回:

> ruby test.rb --move from to 
Should move: true 
From: from 
To: to 

> ruby test.rb from to 
Should move: false 
From: 
To: 

如果代碼應該在默認情況下移動的文件,然後不打擾與--move旗,只需使用:

test.rb from to 

and con sider完全刪除OptionParser塊。

如果代碼應該正常複製選項移動,然後--move變得更明智,充當一個標誌,移動是理想的。

ruby test.rb --move from to 

我不得不對於options[:move]測試代碼並運行該代碼在該點移動,而不是複製。

在任何一種情況下,文件名不應與標誌綁定,應在單獨提供並從ARGV中檢索後才能從OptionParser完成解析命令行並刪除其處理的條目之後檢索。

1

OptionParser的「完整示例」部分下的示例詳細介紹瞭如何接受項目列表。

這是一個基於該示例的示例程序。 opts.on中的第三個參數Array指示應使用輸入src, dst來創建數組。要運行此示例,您需要執行gem install trollop

# test.rb 
require 'optparse' 

options = {} 
OptionParser.new do |opt| 
    opt.on("-m src, dst", "--move src, dst", Array, "Move from src to dst") do |list| 
    options[:src] = list[0] 
    options[:dst] = list[1] 
    end 
end.parse! 

puts options # It's a hash of parsed options 

採樣運行:

> ruby test.rb -m from,to 
{:src=>"src", :dst=>"dst"} 

>ruby test.rb -h 
Usage: test [options] 
    -m, --move src, dst    Move from src to dst 

上述腳本迫使人們使用逗號分隔選項。


正如「Really Cheap Command-Line Option Parsing in Ruby」所指出的,似乎是一個寶石,trollop,即可以相當容易使用命令行解析。

基於Trollop樣本程序在下面給出,其允許的空間使用情況具有多個值

指定選項
# test.rb 

require "trollop" 

opts = Trollop::options do 
    banner "Command line parsing using Trollop" 
    opt :move, "--move src dst', Move from src to dst", :short => "-m", :long => "--move", :type => :strings 
end 
# An array of option values 
p opts.move 

樣品運行:

>ruby test.rb -m hello world 
["hello", "world"] 

>ruby test.rb -h 
Command line parsing using Trollop 
    -m, --move=<s+> '--move src dst', Move from src to dst 
    -h, --help   Show this message 

有幫助之間的微妙的差別兩種方法之間的輸出。 Trollop生成幫助文本,其中--move=<s+>未明確指出它需要接受兩個值,因此我必須重複命令語法描述。

+0

非常感謝,截至今日,我正在使用這種格式。你認爲有沒有擺脫逗號?所以,而不是 - 移動src,dst ...你可以只寫 - 移動src dst ...但歡呼:) –

+0

我想弄清楚,如果我發現的東西,我會更新答案。我認爲'OptionParser#accept'方法會起到一些作用,但在解釋'accept'方法的參數時文檔有點弱 –