ksino's diary

覚えたことを忘れないように、小さなことでも書いていく。

Rubyでコマンドライン引数を解析する

OptionParserってのを使うと簡単らしいです。

# coding: utf-8
require 'optparse'

def cmdline
  args = {}
  OptionParser.new do |parser|
    parser.on('-f', '--foo', '真偽値オプション') {|v| args[:foo] = v}
    parser.on('-b VALUE', '--bar VALUE', '引数付きオプション(必須)') {|v| args[:bar] = v}
    parser.on('-q [VALUE]', '--quz [VALUE]', '引数付きオプション(任意)') {|v| args[:quz] = v}
    parser.parse!(ARGV)
  end 
  args
end

args = cmdline
puts args[:foo]
puts args[:bar]
puts args[:quz]

実行結果は下記のとおり。
"-h"はデフォルトで定義されているようです。

$ ruby options.rb -h
Usage: options [options]
    -f, --foo                        真偽値オプション
    -b, --bar VALUE                  引数付きオプション(必須)
    -q, --quz [VALUE]                引数付きオプション(任意)

便利ですね。

真偽値オプションのみ指定した場合は以下。

$ ruby options.rb -f
true

続いて、引数付きオプション(必須)を、引数なしで指定した場合は

$ ruby options.rb -f -b
options.rb:10:in `block in cmdline': missing argument: -b (OptionParser::MissingArgument)
	from options.rb:6:in `new'
	from options.rb:6:in `cmdline'
	from options.rb:15:in `<main>'

怒られました。

引数付きオプション(必須)を、引数ありで指定した場合は

$ ruby options.rb -f -b BAR
true
BAR

正しく呼べてますね。

引数付きオプション(任意)を、引数なしで指定しても

$ ruby options.rb -f -b BAR -q
true
BAR

例外は発生しませんでした。引数なし(オプション)の値は、上記だと空文字に見えてしまっていますが、nilになっているようです。

引数付きオプション(任意)を、引数で指定した場合

$ ruby options.rb -f -b BAR -q QUZ
true
BAR
QUZ