【问题标题】:How can I split a string likes shells do to populate ARGV?如何像 shell 那样拆分字符串来填充 ARGV?
【发布时间】:2011-05-20 05:57:26
【问题描述】:

我想要一个 Ruby 方法或一个正则表达式,它可以让我将一串命令行参数拆分成一个类似 ARGV 的数组。我要问的是类似于this question,但在 Ruby 中。

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

我要测试的方法是这样的:

def parse_args(args)
  Trollop::options(args) do
    # ... parse options based on flags
  end
end

在我的程序中,我调用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\""]

【问题讨论】:

    标签: ruby string command-line


    【解决方案1】:

    如果您使用的是 1.9,则有 Shellwords。如果您没有使用 1.9 但确实有 Rails,那么您将从 Rails 获得Shellwords。无论哪种情况,您都可以使用Shellwords.shellwords 来解析字符串,就像 POSIX shell 所做的那样:

    >> Shellwords.shellwords("Where is 'pancakes house'?")
    => ["Where", "is", "pancakes house?"]
    

    如果您没有 Rails 或 1.9,那么您可能只需从 Rails 中获取 shellwords.rb 并使用它。

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

    【讨论】:

    • +1,但要注意这也适用于 1.8.7。 (甚至是 1.8.6,我刚试过)。 ruby-doc.org/ruby-1.8/classes/Shellwords.html
    • @Michael:谢谢,我得到了关于它可用的版本的模棱两可的信息,所以我只包括了我可以验证的内容。
    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2015-05-23
    • 1970-01-01
    相关资源
    最近更新 更多