从文件输入选项的正确方法是什么? | Ruby脚本

时间:2014-02-15 11:41:12

标签: ruby

我正在尝试编写一个脚本,该脚本将从主机文件中获取IP地址,并从配置文件中获取用户名信息。我显然没有将文件名作为正确的哈希/值。

我的File.new(options[:config_file], 'r').each { |params| puts params }应该打电话给我?我已经尝试过它当前设置的内容,并且

File.new(config_file, 'r').each { |params| puts params },以及File.new(:config_file, 'r').each { |params| puts params }没有运气。

我应该一起做些不同的事吗?喜欢load(filename = nil)

options = {}

opt_parser = OptionParser.new do |opt|
  opt.banner = 'Usage: opt_parser COMMAND [OPTIONS]'
  opt.on('--host_file','I need hosts, put them here') do |host_file|
    options[:host_file] = host_file
  end
  opt.on('--config_file', 'I need config info, put it here') do |config_file|
    options[:config_file] = config_file
  end
  opt.on('-h', '--help', 'What your looking at') do |help|
    options[:help] = help
    puts opt
  end
end

opt_parser.parse!

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 :(得分:0)

解析主机文件

您可以编写自己的解析器或使用已经实现的解析器。

使用"hosts" gem的示例:(您需要安装它)

require 'hosts'

hosts = Hosts::File.read('/etc/hosts')

entries = hosts.elements.select{ |element| element.is_a? Hosts::Entry }
addresses = Hash[entries.map{ |entry| [entry.name, entry.address] }]

# You should get a hash of entry names and addresses
# {"localhost"=>"127.0.0.1", "ip6-localhost"=>"::1"}

解析配置文件

存储配置的常用方法是使用YAML文件。

考虑以下YAML文件(在'/tmp/config.yml'中):

username: foo
password: bar

您可以使用YAML module

解析此配置文件
require 'yaml'

config = YAML.load_file('config.yml')

# You should get a hash of config values
# {"username"=>"foo", "password"=>"bar"}

如果您不希望密码以明文形式存储在配置文件中,您可以:

  • 如果您的上下文允许,则在运行时询问密码
  • 使用环境变量存储密码并在运行时检索它

修改
如果您只需要从文本文件中提取主机名,考虑每行一个主机名,您可以使用类似hostnames = IO.readlines("config.yml").map{ |line| line.chomp }的内容来获取主机名数组。您可以在遍历此数组后进行操作。

www.ruby-doc.org/core-2.1.0/IO.html#method-i-readline