2

我正在尝试使用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,但必须有更好的解决方案,只是无法弄清楚如何

4

4 回答 4

4

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

于 2009-04-06T13:33:29.800 回答
1

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

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

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

于 2009-07-30T15:12:20.020 回答
0

希望这个答案仍然有用。

Ruby 有一个built-in变量__FILE__可以完成这种类型的工作。

puts __FILE__

它会打印出你的文件名。

于 2020-09-07T15:39:21.043 回答
-1

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

require 'optparse'

file = ARGV.pop
opts = OptionParser.new do |opts|
  # ...
end
于 2009-04-06T13:18:59.663 回答