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