我正在尝试为我的Ruby脚本定义选项,该脚本将用户A的消息发送给用户B以进行测试。但是当某些选项在值中有空格时,我无法使其工作。例如:
OptionParser.new do |opts|
opts.on("-p", "--params a=A,b=B,c=C", Array, "Parameters to compose the message") do |params|
options.params = params.map { |p| p.split("=") }
end
end
但是当我尝试指定像-p SENDER=foo,RECIPIENT=bar,BODY=foo bar
这样的东西时,它只是让我回到["SENDER" => "foo", "RECIPIENT" => "bar", "BODY" => "foo"]
。
我也尝试了-p SENDER=foo,RECIPIENT=bar,BODY='foo bar'
,但也没有运气。
OptionParser是否支持这种情况?
谢谢!
答案 0 :(得分:5)
使用单引号或双引号括起参数:
-p 'SENDER=foo,RECIPIENT=bar,BODY=foo bar'
例如:
require 'optparse'
options = {}
OptionParser.new do |opt|
opt.on('-p', '--params OPTS', Array) { |o| options[:p] = o }
end.parse!
require 'pp'
pp options # =>
使用以下命令在命令行运行:
ruby test.rb --params 'SENDER=foo,RECIPIENT=bar,BODY=foo bar'
输出:
{:p=>["SENDER=foo", "RECIPIENT=bar", "BODY=foo bar"]}
这不是OptionParser问题,它是解析选项并将它们传递给脚本时命令行的工作方式。只有在看到参数'SENDER=foo,RECIPIENT=bar,BODY=foo bar'
并将逗号分成数组并将其传递给opt.on
块时,OptionParse才会参与其中:
'SENDER=foo,RECIPIENT=bar,BODY=foo bar'.split(',')
# => ["SENDER=foo", "RECIPIENT=bar", "BODY=foo bar"]
由于以下原因,您似乎正在尝试将传入数据拆分为数组:
options.params = params.map { |p| p.split("=") }
我建议考虑将其转换为哈希值:
opt.on('-p', '--params OPTS', Array) { |o| options[:p] = Hash[o.map{ |s| s.split('=') }] }
结果是:
{:p=>{"SENDER"=>"foo", "RECIPIENT"=>"bar", "BODY"=>"foo bar"}}
并且可以轻松获取传入的特定条目:
pp options[:p]['BODY'] # => "foo bar"