我如何分割像shell这样的字符串来填充ARGV?

Rya*_*yan 8 ruby string command-line

我想要一个Ruby方法或一个正则表达式,让我将一串命令行参数分成一个类似ARGV的数组.我问的问题类似于这个问题,但在Ruby中.

我正在为使用Trollop处理命令行输入的Ruby程序编写单元测试(尽管这个问题对于任何其他选项解析器都是相同的).

我想测试的方法如下所示:

def parse_args(args)
  Trollop::options(args) do
    # ... parse options based on flags
  end
end
Run Code Online (Sandbox Code Playgroud)

在我的节目中,我打电话parse_args(ARGV).在我的测试中,我认为我可以在空格中传递一个字符串,但这不是ARGV的行为.比较以下内容:

./argv_example.rb -f -m "Hello world" --extra-args "-vvv extra verbose"
=> ["-f", "-m", "Hello world", "--extra-args", "-vvv extra verbose"]

'-f -m "Hello world" --extra-args "-vvv extra verbose"'.split
=> ["-f", "-m", "\"Hello", "world\"", "--extra-args", "\"-vvv", "extra", "verbose\""]
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 11

如果您使用1.9,则有Shellwords.如果您没有使用1.9但确实有Rails,那么您将从Rails 获得Shellwords.在任何一种情况下,您都可以使用Shellwords.shellwords像POSIX shell那样解析字符串:

>> Shellwords.shellwords("Where is 'pancakes house'?")
=> ["Where", "is", "pancakes house?"]
Run Code Online (Sandbox Code Playgroud)

如果你没有Rails或1.9那么你可能只是shellwords.rb从Rails中获取并使用它.

更新:看起来Shellwords可以在Ruby 1.8中使用(谢谢Michael Khol).我得到了关于哪些特定版本有它的模糊结果.

  • +1,但是要注意,这也适用于1.8.7.(甚至1.8.6,我刚试过).http://www.ruby-doc.org/ruby-1.8/classes/Shellwords.html (4认同)