将带有破折号的字符串作为参数传递到Trollop

时间:2016-05-27 09:54:45

标签: ruby trollop

我创建了非常简单的ruby脚本,用Trollop(2.1.2)解析参数。它工作正常,直到我以-作为参数传递值。例如:

def main
  opts = Trollop::options do
    opt :id, 'Video Id', :type => String
    opt :title, 'Video Title', :type => String
  end

  if opts[:id].nil? 
    Trollop::die :id, 'please specify --id'
  end

当我用

运行它时
ruby my_script.rb --id '-WkM3Blu_O8'

失败并显示错误

Error: unknown argument '-W'.
Try --help for help.

那我该如何处理这个案子?

1 个答案:

答案 0 :(得分:0)

Trollop的工作是解析命令行选项。如果你有一个选项定义为' -W',它如何区分该选项和恰好以' -W'开头的参数?

所以,即使有一个Trollop选项忽略未知选项并让它们作为参数传递给你的程序,如果你定义了任何选项,当一个字符串以一个连字符开头后跟定义时你仍会遇到问题选项的信。

您可以做的一件事是要求希望使用连字符开始参数的用户在其前面加上反斜杠。这样就可以成功地将它从Trollop中隐藏起来,但在使用之前你需要删除反斜杠。只要反斜杠永远不会是id字符串中的合法字符,这应该没问题。

顺便说一句,您可能希望添加short选项:

require 'trollop'
opts = Trollop::options do
  opts = Trollop::options do
    opt :id,    'Video Id',    type: String, short: :i
    opt :title, 'Video Title', type: String, short: :t
  end
end

p opts
p ARGV

您可以尝试像这样运行它,然后观察结果:

➜  stack_overflow git:(master) ✗   ./trollop.rb -i 3 '\-i1'
{:id=>"3", :title=>nil, :help=>false, :id_given=>true}
["\\-i1"]