Rubyのoptparseの使い方

こんにちは!

今回はRubyのoptparseの使い方についてまとめます。

optparseとは

  • コマンドラインのオプションを取り扱うライブラリ
    • opt -> オプション
    • parse -> 解析

使用例

require 'optparse' # optparseの読み込み
opt = OptionParse.new # OptionParserオブジェクトを生成

opt.on('-a') # オプション -a を受け付ける

opt.parse!(ARGV) # オプションの解析
  • ARGV: Rubyスクリプトに与えられた引数を表す配列
    • 組み込み変数$*の別名

parse!/parseメソッド

  • ARGVの解析を行う
  • onメソッドにブロックが指定されている場合、parse!/parseが呼ばれたときに実行される

parse!とparseの違い

  • 例: ruby sample.rb -a foo bar

parse!の場合

  • parse!はARGVから-aなどのオプションを削除する
    • ARGV自体を書き換える
p ARGV # => ["-a", "foo", "bar"]
opt.parse!(ARGV)
p ARGV # => ["foo", "bar"]

parseの場合

  • parseはオプションを残す
p ARGV # => ["-a", "foo", "bar"]
opt.parse(ARGV)
p ARGV # => ["-a", "foo", "bar"]

どのオプションが呼ばれたか記憶する

  • 例: ruby sample.rb -a foo bar -b baz

    方法1

params = {}

opt.on('-a') { |v| params[:a] = v }
opt.on('-b') { |v| params[:b] = v }

opt.parse!(ARGV)
p ARGV # => ["foo", "bar", "baz"]
p params #=> {:a=>true, :b=>true}
  • ブロックパラメータvには、オプションが存在するかどうかの真偽値が入る

方法2

params = {}

opt.on('-a') { |v| v }
opt.on('-b') { |v| v }

opt.parse!(ARGV, into: params)
p ARGV # => ["foo", "bar", "baz"]
p params # => {:a=>true, :b=>true}

引数を受け取る

方法1

  • 例: ruby sample.rb -a foo bar -b baz
params = {}

opt.on('-a VAL') { |v| v }
opt.on('-b VAL') { |v| v }

opt.parse!(ARGV, into: params)
p ARGV # => ["bar"]
p params # => {:a=>"foo", :b=>"baz"}
  • onメソッドのオプション定義の末尾に文字列を書くと、そのオプションが引数を受け取ることの指定になる
    • 文字列はなんでもよい
      • ヘルプの見栄えが良くなるように書く
    • 引数を省略すると例外が発生する
      • オプションが必須でないときはon('-a [VAL]')と[ ]をつける

方法2

params = ARGV.getopts("a:b:")
p params # => {:a=>"foo", :b=>"baz"}
  • optparseをrequireすると、ARGV.getoptsが使えるようになる
    • 引数を受け取る場合は文字列:
    • 引数を受け取らない場合は文字列

おわりに

今回はRubyのoptparseの使い方についてまとめました。リファレンスマニュアルにはほかにも詳細な指定方法などが乗っていますが、細かい指定が必要ない場合はgetoptsを使うのがお手軽ですね。

100/100