有几种方法可以使用optparse接受给定参数的多个值。一些方法允许使用空格分隔的列表,但每种方法都有其优缺点。好消息是这些方法可以互换使用,因此您始终可以实现多种方法,并让最终用户使用他们喜欢的方法。
假设有一个名为process_files.rb
的脚本,如下所示:
require 'optparse'
args = { files: [] }
OptionParser.new do |opts|
opts.on('--files FILE1,FILE2,...', Array, 'A list of comma-separated files.') do |files|
args[:files].concat(files)
end
opts.on('-f', '--file FILE', 'A single file. Repeat for multiple files.') do |file|
args[:files] << file
end
opts.on('--colon-files FILE1:FILE2:...', 'A colon-delimited file list.') do |str|
args[:files].concat(str.split(':'))
end
opts.on('--spaced-files "FILE1 FILE2 ..."', 'A space-delimited file list.') do |str|
args[:files].concat(str.split(/\s+/))
end
end.parse!
args[:files].concat(ARGV)
puts args[:files].inspect
以下是将文件列表传递给它的各种方法:
$ ruby process_files.rb --files foo,bar,baz
["foo", "bar", "baz"]
$ ruby process_files.rb -f foo -f bar -f baz
["foo", "bar", "baz"]
$ ruby process_files.rb --colon-files foo:bar:baz
["foo", "bar", "baz"]
$ ruby process_files.rb --spaced-files 'foo bar baz'
["foo", "bar", "baz"]
$ ruby process_files.rb foo bar baz
["foo", "bar", "baz"]
$ ruby process_files.rb --files apple,banana -f cherry --colon-files date:elderberry \
--spaced-files 'fig grape' honeydew
["apple", "banana", "cherry", "date", "elderberry", "fig", "grape", "honeydew"]
参考:https://rubyreferences.github.io/rubyref/stdlib/cli/optparse.html