【问题标题】:Extracting filenames from command line arguments with Ruby使用 Ruby 从命令行参数中提取文件名
【发布时间】:2009-04-06 13:02:35
【问题描述】:

我正在尝试使用optparse 来解析命令行参数。我希望我的程序接受这样的参数:

$ ./myscript.rb [options] filename

我可以轻松管理[options] 部分:

require 'optparse'

options = { :verbose => false, :type => :html }

opts = OptionParser.new do |opts|
  opts.on('-v', '--verbose') do
    options[:verbose] = true
  end
  opts.on('-t', '--type', [:html, :css]) do |type|
    options[:type] = type
  end
end
opts.parse!(ARGV)

但是我如何获得filename

我可以从ARGV手动提取它,但必须有更好的解决方案,只是不知道如何

【问题讨论】:

    标签: ruby optparse


    【解决方案1】:

    “parse”方法返回未处理的 ARGV。因此,在您的示例中,它将返回一个包含文件名的单元素数组。

    【讨论】:

      【解决方案2】:

      我不能只使用 ARGV.pop。例如 当最后一个参数是“css”时 可以是文件或属于 --type 开关。

      但是,如果您的脚本要求最后一个参数是文件名(这是您的使用输出查询的内容),这种情况永远不会发生,脚本应该以非零值退出,并且用户应该得到使用报告或错误。

      现在,如果您想创建一个默认文件名或不需要文件名作为最后一个参数但保留它是可选的,那么您可以测试最后一个参数是否是有效文件。如果是这样,请按预期使用它,否则继续没有等。

      【讨论】:

        【解决方案3】:

        希望这个答案仍然有用。

        Ruby 有一个built-in 变量__FILE__ 可以做这类工作。

        puts __FILE__
        

        它会打印出你的文件名。

        【讨论】:

          【解决方案4】:

          我不认为在将其发送到 OptionParser 之前提取它是不好的,我认为这是有道理的。我可能这么说是因为我以前从未使用过OptionParser,但是哦,好吧。

          require 'optparse'
          
          file = ARGV.pop
          opts = OptionParser.new do |opts|
            # ...
          end
          

          【讨论】:

          • 我不能只使用 ARGV.pop。例如,当最后一个参数是“css”时,它可能是一个文件或属于 --type 开关。
          • 不要这样做;请参阅第一个答案,因为 OptionParser 已经提供了一个简单的解决方案。
          猜你喜欢
          • 1970-01-01
          • 2018-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-04
          • 2011-01-12
          • 1970-01-01
          相关资源
          最近更新 更多