我遇到了OptionParser make_switch
的问题。
我的代码解析了三个参数并运行测试以查看我的MANDATORY参数是否在此处:
#!/usr/bin/env ruby
require 'optparse'
require 'ostruct'
options = OpenStruct.new
@argv = ARGV
optparse = OptionParser.new do |opts|
@opts=opts
usage = "USAGE: ./#{File.basename($0)} [-v] -p xxxxxx"
@opts.banner = usage
@opts.on( '-p', '--pdu [PDU]', 'Specify a PDU to configure') do |res|
options.pdu = true
$pdu_name = res
end
@opts.on( '-v', '--[no-]verbose', 'Run verbosely') do
options.verbose = true
end
@opts.on( '-?', '-help','Show this message') do
puts "Help Me!"
puts @opts
exit 1
end
end
begin
if not @argv.empty?
optparse.order!(@argv)
if !options.pdu
$stderr.puts "Options -p missing."
$stderr.puts "#{@opts}\n\n"
exit 1
end
else
$stderr.puts "ERROR: Arguments Required."
$stderr.puts "#{@opts}\n\n"
exit 1
end
rescue OptionParser::InvalidOption
$stderr.puts "ERROR: Invalid option."
$stderr.puts "#{@opts}\n\n"
exit 1
end
除了-?
之外,一切正常:
xxx$ ./myscript.rb -?
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:451:in
`parse': missing argument: -? (OptionParser::MissingArgument)
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1295:in `parse_in_order'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1254:in `catch'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1254:in `parse_in_order'
from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/optparse.rb:1248:in `order!'
blabla
然而-help
完美无缺:
xxxx$ ./myscript.rb -help
Help me!
USAGE: ./myscript.rb [-v] -p xxxxxx
-p, --pdu [PDU] Specify a PDU to configure
-v, --[no-]verbose Run verbosely
-?, -help Show this message
更令人惊讶的是,-? -v
也有效:
xxxx$ ./myscript.rb -? -v
Help Me!
USAGE: ./myscript.rb [-v] -p xxxxxx
-p, --pdu [PDU] Specify a PDU to configure
-v, --[no-]verbose Run verbosely
-?, -help Show this message
我做错了什么?
如果我在代码中将-?
替换为-h
,则会出现同样的问题。
答案 0 :(得分:2)
或许快速查看(有些令人困惑的)文档会对情况有所了解。如果您查看文档,最终会在OptionParser#make_switch
处找到opt.on
参数的解释:
长款开关:
指定长样式开关,该开关采用强制,可选或无参数。它是以下形式的字符串:"--switch=MANDATORY" or "--switch MANDATORY" "--switch[=OPTIONAL]" "--switch"
短款式开关:
指定短样式开关,它采用强制,可选或无参数。它是以下形式的字符串:"-xMANDATORY" "-x[OPTIONAL]" "-x"
请注意-xMANDATORY
,然后仔细查看@opts.on
电话:
@opts.on( '-?', '-help','Show this message') do
# ---------------^^^^^
-help
定义了-h
选项,其中包含必需的elp
参数。据推测,选项解析器将其解释为-h
是-?
的别名,并且由于-h
是使用必需参数定义的,因此-?
也需要参数。如果您使用--help
(即长样式切换),那么您可能会有更好的时间:
@opts.on('-?', '--help', 'Show this message') do
我使用的是Ruby 2.0版本,但我怀疑自从您使用的旧版Ruby以来,选项解析器已经发生了很大的变化。