使用 OptionParser 解析 Ruby 中的多个命令行选项
Parse multiple command line options in Ruby using OptionParser
我刚开始为 Ruby 使用 OptionParser,我想使用不止一个参数的标志。
例如,我希望能够 运行:
script --move src dst
请注意 src
和 dst
没有使用逗号分隔。
我最初的想法是:
opts.on("-m src dst", "--move src dst ", "move file from SRCto DST") do |src|
# do something
end
但这不起作用。我认为这不是正确的方法。但这怎么可能呢?
OptionParser 的 "Complete Example" 部分下的示例详细说明了如何接受项目列表。
这是一个基于该示例的示例程序。 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", there seems to be a 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+>
没有明确指出它需要接受两个值,所以我不得不重复命令语法描述。
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 }"
保存并运行使用参数的各种组合returns:
> 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
检索。
我刚开始为 Ruby 使用 OptionParser,我想使用不止一个参数的标志。
例如,我希望能够 运行:
script --move src dst
请注意 src
和 dst
没有使用逗号分隔。
我最初的想法是:
opts.on("-m src dst", "--move src dst ", "move file from SRCto DST") do |src|
# do something
end
但这不起作用。我认为这不是正确的方法。但这怎么可能呢?
OptionParser 的 "Complete Example" 部分下的示例详细说明了如何接受项目列表。
这是一个基于该示例的示例程序。 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", there seems to be a 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+>
没有明确指出它需要接受两个值,所以我不得不重复命令语法描述。
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 }"
保存并运行使用参数的各种组合returns:
> 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
检索。