[Ruby]コマンドライン引数とオプション処理
ややこしいのでまとめた。
optparseライブラリ
コマンドライン引数を扱うライブラリ。(標準添付ライブラリ)
基本的には以下の流れになる。
1. OptionParserオブジェクトoptを生成する
2. オプションを取り扱うブロックをoptに登録する
3. opt.parse(ARGV)でコマンドラインを実際にparseする
例:オプション -a, -b を受け付けるコマンドを作成する
require 'optparse'
opt = OptionParser.new
opt.on('-a') {|v| p v }
opt.on('-b') {|v| p v }
opt.parse!(ARGV)
p ARGV
ruby ls_opt.rb -a foo bar -b baz
#=> true
# true
# ["foo", "bar", "baz"]
OptionParser#onメソッドの引数でオプションを定義し、引数が指定された時の処理をブロックで記述する。ブロックの引数にはオプションが指定されたことを示すtrueが渡される。OptionParser#onメソッドが呼ばれた時点では、eachメソッドなどと違いブロックは実行されず、あくまで登録されるだけである。OptionParser#parseが呼ばれた時に、コマンドラインにオプションが指定されていれば実行される。
引数の処理
引数はoptparseを使わなくても定数ARGVから取得できる。
ライブラリ一覧 > 組み込みライブラリ > Objectクラス > ARGV (private)
puts ARGV
ruby ls_opt.rb foo bar
#=> foo
# bar
puts ARGV[0]
puts ARGV[1]
ruby ls_opt.rb foo bar baz
#=> foo
# bar
ショートネームオプションの処理
ARGV.getoptsを使う。
ライブラリ一覧 > optparseライブラリ > OptionParser::Arguableモジュール > getopts
require 'optparse'
options = ARGV.getopts('a')
puts options
ruby ls_opt.rb -a
#=> {"a"=>true}
引数付きショートネームオプションの処理
require 'optparse'
options = ARGV.getopts('a:')
puts options
ruby ls_opt.rb -a 123
#=> {"a"=>"123"}
ロングネームオプションの処理
require 'optparse'
options = ARGV.getopts('', 'abc')
puts options
ruby ls_opt.rb --abc
#=> {"abc"=>true}
引数付きロングネームオプションの処理
require 'optparse'
options = ARGV.getopts('', 'abc:')
puts options
ruby ls_opt.rb --abc 567
#=> {"abc"=>"567"}
色々オプションの処理
require 'optparse'
options = ARGV.getopts('ab:', 'bar', 'buz:')
puts options
ruby ls_opt.rb -a -b 1 --bar --buz 333
#=> {"a"=>true, "b"=>"1", "bar"=>true, "buz"=>"333"}