はじめに
なぜoptparseを学ぶことになったかというと
Rubyでカレンダーを作成する際に、macのcal
コマンドで表示されるようなカレンダーを表示したかったのでoptparseを使用しました。
どういうものか
コマンドラインのオプションを取り扱うためのライブラリ
- コマンドライン引数は、ターミナルから実行時に引数を渡して読み込める仕組み。
- 引数は文字列として出力されます。
OptionParser 基本的な使い方
- OptionParser オブジェクト opt を生成する。
- オプションを取り扱うブロックをoptに登録する。
- opt.parse(ARGV)でコマンドラインを実際にparseする。
1. OptionParser オブジェクト opt を生成する。
require 'optparse'
opt = OptionParser.new
optparseライブラリをスクリプトに読み込みます。
これにより、コマンドライン引数の解析とオプションの処理が可能になります。
2. オプションを取り扱うブロックをoptに登録する。
require 'optparse'
opt = OptionParser.new
#aに渡ってきた引数をvに格納
opt.on('-a') {|v| p v }
OptionParse#onメソッドの引数でオプション-aを定義して、
引数が指定されたときの処理をブロック内に記述する
3. opt.parse(ARGV)でコマンドラインを実際にparseする。
require 'optparse'
opt = OptionParser.new
#aに渡ってきた引数をvに格納
opt.on('-a') {|v| p v }
# 真偽値を表示。
opt.parse!(ARGV)
p ARGV
$ruby sample.rb -a foo
# aに引数が渡っていますのでtrue。そしてfooを表示
=> true
["foo"]
ARGVは、プログラムに渡されたコマンドライン引数の配列です。
opt.parse!メソッドを使って、配列を解析し、指定されたオプションを処理します。
定義していないオプションを指定すると例外 OptionParser::InvalidOption が発生します。
引数が2つの場合
require 'optparse'
opt = OptionParser.new
opt.on('-a') {|v| p v }
opt.on('-b') {|v| p v }
opt.parse!(ARGV)
p ARGV
$ruby sample.rb -a fooe -b baz
=>true
true
["foo", "baz"]
OptionParser 自体は、どのオプションが指定されたかを記憶しないので、
後の処理の方で、オプションによる条件判断を加えるには、 他のコンテナに格納します。
require 'optparse'
opt = OptionParser.new
# オプションの値を格納
options = {}
opt.on('-a') {|v| options[:a] = v }
opt.on('-b') {|v| options[:b] = v }
opt.parse!(ARGV)
p ARGV
p options
$ruby sample.rb -a foo bar -b baz
=>["foo", "bar", "baz"]
{:a=>true, :b=>true}
ARGV の機能
OptionParser::Arguableモジュールのgetoptsメソッドによって
オプションや引数をシンプルに扱うだけであれば記述量が少なくて済みます。
require 'optparse'
# 引数にオプションa, オプションbを指定
params = ARGV.getopts("a:b:")
p params
$ruby sample.rb -a foo -b bar
=>{"a"=>foo, "b"=>"bar"}
ワンライナーでオプションと引数を受け取り、Hashとして取得できます。オプションが引数をとる場合は後ろに ":" を付けます。
参考サイト