使用Ruby从命令行参数中提取文件名

使用Ruby从命令行参数中提取文件名,ruby,optparse,Ruby,Optparse,我正在尝试使用解析命令行参数。我希望我的程序能够接受这样的参数: $ ./myscript.rb [options] filename 我可以轻松管理[选项]部分: require 'optparse' options = { :verbose => false, :type => :html } opts = OptionParser.new do |opts| opts.on('-v', '--verbose') do options[:verbose] = t

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

$ ./myscript.rb [options] filename
我可以轻松管理
[选项]
部分:

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)
但是如何获取
文件名


我可以从
ARGV
中手动提取它,但必须有更好的解决方案,只是不知道如何将它发送到OptionParser之前提取它是不好的,我认为这是有意义的。我之所以这样说,可能是因为我以前从未使用过
OptionParser
,但很好

require 'optparse'

file = ARGV.pop
opts = OptionParser.new do |opts|
  # ...
end
“parse”方法返回未处理的ARGV。因此,在您的示例中,它将返回一个包含文件名的单元素数组


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

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


现在,如果您想设置默认文件名,或者不需要将文件名作为最后一个参数,但将其保留为可选,那么您可以测试最后一个参数是否为有效文件。如果是这样,请按预期使用,否则请继续,不要使用等。希望此答案仍然有用

Ruby有一个
内置的
变量
\uuuuu文件
可以完成这类工作

put\u文件__

它会打印出您的文件名。

我不能只使用ARGV.pop。例如,当最后一个参数是“css”时,它可以是一个文件,也可以属于--type开关;请参阅第一个答案,因为OptionParser已经提供了一个简单的解决方案。