簡體   English   中英

使用OptionParser在Ruby中解析多個命令行選項

[英]Parse multiple command line options in Ruby using OptionParser

我剛開始使用OptionParser for Ruby,我想使用不僅僅使用一個參數的標志。

例如,我希望能夠運行:

script --move src dst

請注意srcdst如何使用dst分隔。

我最初的想法是:

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

但這不起作用。 我認為這不是正確的方法。 但是怎么辦呢?

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

並考慮完全刪除OptionParser塊。

如果代碼通常應該與移動選項一起復制,那么 - --move變得更加明智,可以作為需要移動的標志。

ruby test.rb --move from to

我有代碼測試options[:move]並運行代碼來移動而不是復制。

在任何一種情況下,文件名都不應該與標志綁定,它們應該單獨提供,並在OptionParser完成解析命令行並刪除它處理的條目后從ARGV檢索。

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

上面的腳本強制一個用逗號分隔選項。


正如“ Ruby中真正便宜的命令行選項解析 ”所示,似乎有一個gem, 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+>並未明確指出它需要接受兩個值,因此我不得不重復命令語法描述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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