ruby - 使用 OptionParser 解析 Ruby 中的多个命令行选项

标签 ruby parsing command-line optionparser

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

例如,我希望能够运行:

script --move src dst

请注意 srcdst 没有使用逗号分隔。

我最初的想法是:

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

但这行不通。我认为这不是正确的方法。但这怎么可能呢?

最佳答案

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

这是一个基于该示例的示例程序。第三个参数Arrayopts.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+>没有明确表示它需要接受两个值,所以我不得不重复命令语法描述。

关于ruby - 使用 OptionParser 解析 Ruby 中的多个命令行选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34416847/

相关文章:

ruby-on-rails - 在 rails/ruby 中使用 group_by

c# - 如何提取 http xml 答案的值

MySql 命令行 : execute two queries at once?

ruby-on-rails - Action 邮件 SMTP google apps

ruby-on-rails - 使用 send_file 从 Amazon S3 下载文件?

php - 解析搜索字符串

android - 我如何格式化解析并传递给 editText 的数字?

java - getRuntime().exec 未按预期执行

linux - 如何在不指定完整路径的情况下运行程序?

ruby-on-rails - 如何通过 form_for on rails 传递与模型无关的参数?