Ruby OptionParser如何处理带空格的参数?

时间:2014-08-13 19:54:49

标签: ruby

我正在尝试为我的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是否支持这种情况?

谢谢!

1 个答案:

答案 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"