在命令行红宝石中进行ARGV [0]可选



我有以下代码:

#!/usr/bin/env ruby
require 'yaml'
require 'json'
require 'getoptlong'
DEFAULT_CONF_FILE = 'conf.yaml'
    opts = GetoptLong.new(
        [ '--asn', '-a', GetoptLong::OPTIONAL_ARGUMENT ],
        [ '--modify', '-m', GetoptLong::OPTIONAL_ARGUMENT ]
    )
    config_file = ARGV[0]
    if config_file.to_s.empty?
      config_file = DEFAULT_CONF_FILE
    end
    opts.each do |opt, arg|
      case opt
        when '--asn'
          write_asn_database(arg,config_file)
        when '--modify'
          generate_modify_conf_file(arg,config_file)
      end
    end

此代码根据给定的YAML配置文件生成一些JSON文件。我想做的是:

  • 如果在命令行中给出了一个conf文件,则程序将使用该给定文件;
  • 如果没有,它将使用默认文件。

类似:

示例1(带有conf文件):

$ ./my_script.rb new_conf_file.yaml -a

示例2(没有conf文件):

$ ./my_script.rb -a

第一个示例有效,第二个示例给了我以下错误:

 No such file or directory @ rb_sysopen - -a (Errno::ENOENT)

这是有道理的,因为程序假设选项-a是文件。

我是Ruby的新手,我从未使用过命令行来运行脚本。

好吧,我会在这里发布。请不要这样做,因为这只是丑陋:

config_file = ARGV[0]
unless File.exist?(config_file)
  config_file = DEFAULT_CONF_FILE
end

GetoptLong文档的第一段:

空选项--(两个减去符号)用于结束选项处理。如果选项具有可选的参数,这可能特别重要。

通过调用脚本为:

使用您的代码
#                 ⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓⇓  
./my_script.rb -a -- new_conf_file.yaml

另外,应该将opts读数part 放在之前,要明确处理ARGV

,不,使用GetoptLong,不可能解析您正确提供的命令行。

最新更新