зеркало из https://github.com/github/ruby.git
126 строки
2.8 KiB
Ruby
Executable File
126 строки
2.8 KiB
Ruby
Executable File
#!/usr/bin/ruby -I.
|
|
|
|
require 'optparse'
|
|
require 'optparse/time'
|
|
require 'pp'
|
|
|
|
# keywords
|
|
CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]
|
|
CODE_ALIASES = {"jis" => "iso-2022-jp", "sjis" => "shift_jis"}
|
|
POSSIBLE_CODES = "(#{(CODES+CODE_ALIASES.keys).join(',')})"
|
|
|
|
ARGV.options do
|
|
|opts|
|
|
opts.banner << " argv..."
|
|
|
|
# separator
|
|
opts.on_tail
|
|
opts.on_tail("common options:")
|
|
|
|
# no argument, shows at tail
|
|
opts.on_tail("--help", "show this message") do
|
|
puts opts
|
|
exit
|
|
end
|
|
|
|
# mandatory argument
|
|
opts.on("-r", "--require=LIBRARY", String,
|
|
"require the LIBRARY, before",
|
|
"executing your script") do
|
|
|lib|
|
|
@library = lib
|
|
end
|
|
|
|
# optional argument
|
|
opts.on("-i", "--inplace=[EXTENSION]",
|
|
"edit ARGV files in place", # multiline description
|
|
"(make backup if EXTENSION supplied)") do
|
|
|inplace|
|
|
@inplace = inplace || ''
|
|
end
|
|
|
|
opts.on("-N=[NUM]", Integer) do
|
|
|num|
|
|
@number = num
|
|
end
|
|
|
|
# additional class
|
|
opts.on("-t", "--[no-]time[=TIME]", Time, "it's the time") do
|
|
|time|
|
|
@time = time
|
|
end
|
|
|
|
# limit argument syntax
|
|
opts.on("-[0-7]", "-F", "--irs=[OCTAL]", OptionParser::OctalInteger,
|
|
"specify record separator", "(\\0, if no argument)") do
|
|
|irs|
|
|
@irs = irs
|
|
end
|
|
|
|
# boolean switch(default true)
|
|
@exec = true
|
|
opts.on("-n", "--no-exec[=FLAG]", TrueClass, "not really execute") do
|
|
|exec|
|
|
@exec = exec
|
|
end
|
|
|
|
# array
|
|
opts.on("-a", "--list[=LIST,LIST]", Array, "list") do
|
|
|list|
|
|
@list = list
|
|
end
|
|
|
|
# fixed size array
|
|
opts.on("--pair[=car,cdr]", Array, "pair") do
|
|
|x, y|
|
|
@x = x
|
|
@y = y
|
|
end
|
|
|
|
# keyword completion
|
|
opts.on("--code=CODE", CODES, CODE_ALIASES, "select coding system",
|
|
"("+CODES.join(",")+",", " "+CODE_ALIASES.keys.join(",")+")") do
|
|
|c|
|
|
@code = c
|
|
end
|
|
|
|
# optional argument with keyword completion
|
|
opts.on("--type[=TYPE]", [:text, :binary], "select type(text, binary)") do
|
|
|t|
|
|
@type = t
|
|
end
|
|
|
|
# boolean switch with optional argument(default false)
|
|
opts.on("-v", "--[no-]verbose=[FLAG]", "run verbosely") do
|
|
|v|
|
|
@verbose = v
|
|
end
|
|
|
|
# easy way, set local variable
|
|
opts.on("-q", "--quit", "quit when ARGV is empty") do
|
|
|q|
|
|
@quit = q
|
|
end
|
|
|
|
# adding on the fly
|
|
opts.on("--add=SWITCH=[ARG]", "add option on the fly", /\A(\w+)(?:=.+)?\Z/) do
|
|
|opt, var|
|
|
opts.on("--#{opt}", "added in runtime", &eval("proc {|x|@#{var}=x}"))
|
|
end
|
|
|
|
opts.on_head("specific options:")
|
|
|
|
# no argument
|
|
opts.on_tail("--version", "show version") do
|
|
puts OptionParser::Version.join('.')
|
|
exit
|
|
end
|
|
opts.parse!
|
|
end
|
|
|
|
pp self
|
|
begin print ARGV.options; exit end if @quit
|
|
ARGV.options = nil # no more parse
|
|
puts "ARGV = #{ARGV.join(' ')}" if !ARGV.empty?
|
|
#opts.variable.each {|sym| puts "#{sym} = #{opts.send(sym).inspect}"}
|