1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
#!/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}"}
|