4

我刚刚开始使用 OptionParser for Ruby,我想使用不仅仅使用一个参数的标志。

例如,我希望能够运行:

script --move src dst

请注意如何使用昏迷来分隔srcdst不分隔。

我最初的想法是:

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

但这不起作用。我认为这不是正确的方法。但是这怎么可能呢?

4

2 回答 2

3

OptionParser的“完整示例”部分下的示例详细说明了如何接受项目列表。

这是基于该示例的示例程序。Arrayin 中的第三个参数opts.on表示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 ”所指出的,似乎有一个 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+>并没有清楚地表明它需要接受两个值,所以我不得不重复命令语法描述。

于 2015-12-22T17:06:36.163 回答
1

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]并运行代码以移动而不是复制。

在任何一种情况下,文件名都不应该与标志绑定,它们应该单独提供并ARGV在 OptionParser 完成命令行解析并删除它处理的条目后检索。

于 2015-12-22T22:40:56.063 回答