optparseとは
Rubyのoptparseはコマンドラインのオプションを取り扱うためのライブラリです。
プログラム実行時に指定されたコマンドを解析し、フラグや引数をプログラム内で扱う事が出来ます。
使い方
まずは基本的な使い方です。
test.rb
# 標準ライブラリを読み込む
require 'optparse'
# OptionParserクラスのオブジェクトを作成する
opt = OptionParser.new
# onメソッドでオプションを定義する
# オプションが指定されていればブロックが実行される
opt.on('-m') { |v| p v }
# parseメソッドでコマンドラインの解析を行う
opt.parse(ARGV)
p ARGV
オプションを指定してプログラムを実行します。
# オプション付きで実行する
$ ruby test.rb -m 10
true # vの出力
["-m", "10"] # ARGVの出力
- オプション付きでプログラムが実行された場合はブロックパラメータにtrueが渡されます。
-
ARGV
はコマンドラインからプログラムに渡される引数を配列で保持しています。 -
parse
メソッドが実行されないとブロックの処理は行われません。
複数の引数を指定してもARGV
に格納されます。
$ ruby test.rb -m 10 20 30
true # vの出力
["-m", "10", "20", "30"] # ARGVの出力
ARGV
にオプションを含めたくない場合はparse!
メソッドを使用します。
test.rb
opt = OptionParser.new
opt.on('-m') { |v| p v }
opt.parse!(ARGV)
p ARGV
$ ruby test.rb -m 10
true # vの出力
["10"] # ARGVの出力 (オプション文字列が含まれない)
ブロックに引数を渡す
ブロックにtrueでは無く、引数を渡す場合はオプションの後に文字列を追記します。
このケースでparse!
メソッドを使用した場合は、ARGV
から引数も取り除かれ空になります。
test.rb
opt = OptionParser.new
# vに引数の値が格納される
opt.on('-m VAL') { |v| p v }
opt.parse!(ARGV)
p ARGV
$ ruby test.rb -m 20
20 # vの出力
[] # ARGVの出力
引数無しでプログラムを実行するとエラーになります。
$ ruby test.rb -m
missing argument: -m (OptionParser::MissingArgument)
引数を任意にする場合は、文字列を[]
で囲みます。
test.rb
opt = OptionParser.new
opt.on('-m [VAL]') { |v| p v }
opt.parse!(ARGV)
p ARGV
$ ruby test.rb -m
nil # vの出力
[] # ARGVの出力
引数を限定する
on
メソッドには特定の値のみを受け取るための引数が用意されています。
正規表現で限定する
第二引数で指定した正規表現に引数がマッチしない場合は例外を投げます。
例えば1桁の数字のみを引数として受け取りたい場合は以下のように記述します。
test.rb
opt = OptionParser.new
opt.on('-m VAL', /[0-9]/) { |v| p v }
opt.parse(ARGV)
$ ruby test.rb -m 9
9
$ ruby test.rb -m 10
invalid argument: -m 10 (OptionParser::InvalidArgument)
クラスで限定する
第二引数で指定したクラスと引数のクラスが異なる場合は例外を投げます。
次の例では受け取る引数をIntegerクラスに限定したものです。
test.rb
opt = OptionParser.new
opt.on('-m VAL', Integer) { |v| p v }
opt.parse(ARGV)
$ ruby test.rb -m 9
9
$ ruby test.rb -m a
invalid argument: -m a (OptionParser::InvalidArgument)
独自に条件を設定する
引数をブロック内に渡して、特定の値のみを通す条件を設定しましょう。
次のコードは1~12の数字のみを受け取るバリデーションです。
test.rb
opt = OptionParser.new
opt.on('-m MONTH', Integer) do |month|
p month if month.between?(1, 12)
end
opt.parse(ARGV)
$ ruby test.rb -m 12
12
$ ruby test.rb -m 13
参考