使用 OptionParser 在 Ruby 中解析多个命令行选项

Dan*_*dez 6 ruby command-line parsing optionparser

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

例如,我希望能够运行:

script --move src dst
Run Code Online (Sandbox Code Playgroud)

请注意如何使用逗号分隔 和srcdst

我最初的想法是:

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

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

the*_*Man 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 }"
Run Code Online (Sandbox Code Playgroud)

保存它并使用参数的各种组合运行它会返回:

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

> ruby test.rb  from to
Should move: false
From:
To:
Run Code Online (Sandbox Code Playgroud)

如果代码默认情况下应该移动文件,那么不必理会该标志--move,只需使用:

test.rb from to
Run Code Online (Sandbox Code Playgroud)

并考虑完全删除 OptionParser 块。

如果代码通常应该通过移动选项进行复制,那么--move充当需要移动的标志就变得更明智。

ruby test.rb --move from to
Run Code Online (Sandbox Code Playgroud)

我会有代码测试options[:move]并运行代码以在此时移动而不是复制。

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