如何使用OptionParser打开带有命令行选项的文件?

时间:2014-02-15 01:03:24

标签: ruby command-line-arguments optionparser

尝试通过命令行选项从文件中打印行时出现此错误

no implicit conversion of true into String (TypeError)
from threat_detection.rb:64:in 'new'
from threat_detection.rb:64:in '<main>'

如果我使用文件名而不是options[:config_file],它会按预期打印文件的行。

if options[:config_file]
  File.new(options[:config_file], 'r').each { |params| puts params }
end

if options[:host_file]
  File.new(options[:host_file], 'r').each { |host| puts host }
end

1 个答案:

答案 0 :(得分:1)

看起来你正试图在Ruby中使用OptionParser类。由于它不是核心库的一部分,因此请确保在程序的顶部包含以下内容:

require 'optparse'

此外,请确保您正确创建选项:

options = {}

optparse = OptionParser.new do |opts|
  options[:config_file] = nil
  opts.on('-f', '--config-file', 'Enter the config file to open.') do
    options[:dry_run] = true
  end
end

optparse.parse!

在命令行中使用标记时,实际上是将变量设置为truefalse。例如,默认情况下,对于大多数操作(例如-v),false(详细)设置为rm。在命令及其可选标志之后是(有时是必需的)命令行参数,这是您的情况下的文件名。

调用脚本应该与

类似
$ ruby ./my_program.rb --config-file /path/to/some/file
       ^               ^             ^
       program         flag          argument

如您所见,optparse选项必须是布尔值。如果标志存在,您只想打开文件(选项为true)。您的程序只需稍作更改即可运行:

if options[:config_file]
  File.new(ARGV[0], 'r').each { |params| puts params }
end

ARGV是脚本的所有命令行参数的数组(在标志之后)。如果只包含一个参数,则需要第一个元素或索引0(ARGV[0])。所有参数都用空格分隔。因此,如果您为options[:host_file]实施相同的技术,则可以使用ARGV[1]