我正在使用 Ruby 执行带有命令行参数的代码。现在我尝试使用具有不同选项的同一程序,因此我将选项放在一个文件中,并且我希望程序读取每一行解释选项并相应地执行程序。
但我得到这个错误。"C:/Ruby193/lib/ruby/1.9.1/optparse.rb:1348:in block in parse_in_order': undefined method
shift' for "--c execue --query unix --Servername abc123":String (NoMethodError)"
我知道它读取文件并将该行视为字符串。但想知道是否有办法克服这个移位错误并将该行视为在命令提示符中输入。或任何更好的解决方案。
这是我的代码。
require 'optparse'
require 'micro-optparse'
# --command execue --query unix command --Servername abc123
f =File.open("list_of_commands.txt", "r")
f.each_line { |line|
line= line.chomp
#line = "--c execue --query unix --Servername abc123"
#line = eval("\"#{line}\"")
puts line
options = {}
OptionParser.new do |opts|
opts.on("-c", "--command result,execue,chart,scpfile", String, "Single command to execute ") do |c|
options[:comd] = c
end
opts.on("-q", "--query remote command, unix command", String, "performs the command on local or remote machine") do |q|
options[:query] = q
end
opts.on("-s", "--servername CHSXEDWDC002 ", String, "server name to execute the command") do |v|
options[:hname] = v
end
opts.on_tail('-h', '--help', 'Show this message') do
puts opts
exit
end
end.parse!(line)
p options
}
该文件的内容如下 --c execue --query unix --Servername abc123
我也尝试使用 micro-optparse 但面临同样的错误。任何解决方法?
更新: 根据“@mu 太短”的建议,我尝试了以下选项。end.parse!("#{Shellwords.shellsplit(line)}") 和/或 end.parse!(Shellwords.shellsplit(line))。但他们都没有工作。
我还尝试使用“line = line.split("\t")" 将行拆分为数组,然后使用 end.parse!(line)。输出为 --c execue --query unix --Servername abc123
但现在我收到错误作为阻止:无效选项--c执行
更新:#2 查看错误,问题在于错误的参数(-c。但感谢用户“@mu 太短”建议使用 Array.
更新: 3 传递数组仅适用于短格式的参数,例如 -c,但是当提供长格式时,它会因无效参数错误而失败。
我没有看到关于 optparse 的太多文档。我什至尝试过微解析,但它需要默认值,这对我来说不是一个选项:(