雑記帳

ちょっとした文章とかメモ書きとか。

optparseライブラリを使う(in Ruby)

コマンドラインオプションって?

コマンドラインオプションを指定してソフトの挙動を変えるという方法は広く使われている手法で、コンパイラも使っている手法です。

今回はRubyに於いて、optparseという標準(?)ライブラリを使うに当たって躓いたのでそれに関するメモです。

コマンドラインオプションというのは例えば

$gcc -o filename -O2 -lglut

とあったら、

  • -o filename
  • -O2
  • -lglut

がそれに当たります。
つまり、これの指定によりgccの実行時の状態を変えているわけです。

Rubyのoptparseライブラリの使い方

基本的な説明は以上で、Rubyライブラリのoptparseの説明に入りましょう。

実際に書いたほうが速いので書いてみました。
——————————–[testparse.rb]————————————

require 'optparse'
#Parserを使う為の準備
OptionParser.new do |o|
    #バージョン情報の設定
    Version = "1.0.0"
    #オプションの設定部
    o.on('-q','--quiet','quiet option') { |b| $quiet = b }
    o.on('-i','--interact','interactive option') { |b| $interactive = b }
    o.on('-f FILENAME') { |filename| $filename = filename }
    o.on('-h','--help','show this message') { puts o; exit }
    #実際にオプションをパースする。 #存在しないオプションでは例外が飛ぶので捕捉する。
    begin
        o.parse!
    rescue
        puts "Invalid option. \nsee #{o}"
        exit
    end 
end
#parserを使った後の各変数の状態を見る。 #実際に使うには不要
p :quiet => $quiet, :interactive => $interactive, :filename => $filename
#実際のオプションによって処理を変える。 #ここが実際のソフトの処理部分。
if $quiet == true then
    puts 'quiet option true.'
end 
if $interactive == true then
    puts 'interactive option true.'
end 
if $filename != nil then
    puts "filename option.\nfilename #{$filename}"
end

———————————————————————————————

さて、順に見ていきましょう。

説明

最初はoptparseライブラリをrequireします。
OptionParser.new do |o|

end
ループ内でパースを行ないます。o.onオブジェクトでオプションを設定するのですが、

o.on('-o','--option','description')

の形式で設定出来ます。

  • 最初の-から始まる1文字オプション
  • –(マイナス2つ)から始まる2文字以上のオプション
  • 最後に説明の形式

に出来ます。

o.parse!部分で実際にパースを行ないます。
ここで実際にo.onで設定してないオプションが現れると例外が発生するので、
Rubyの例外捕捉機構を使います。
ここらへんは入門ページを見てただだければ分かるかと。

これにより、
$ruby testparse.rb -q
又は

$ruby testparse.rb --quiet

では

{:quiet=>true, :interactive=>nil, :filename=>nil}
quiet option true.

となります。

-iオプションも同様に結果になります。

しかし、’-f FILENAME’のオプションと引数を同時に指定するオプションではtrueのみ見ても上手く行かず、
この例だと$filenameのグローバル変数にfilenameの引数部分が格納されるのでtrueには一致しません

なので、デフォルトの状態以外を指定して条件分岐させます。
つまり、
$filename == true
では無く
$filename != nil
かどうかを見てやります。

これを踏まえて、

if $filename != nil then
    puts "filename option.\nfilename #{$filename}"
end

というように書いています。例として、
$ruby testparse.rb -f test.rb
とすると、

{:quiet=>nil, :interactive=>nil, :filename=>"test.rb"}
filename option true.
filename test.rb

となり、上手く条件分岐が出来ました。

では。

広告

optparseライブラリを使う(in Ruby)」への1件のフィードバック

  1. ピンバック:ruby で ARGV をうけるコマンドっぽいものを作ってみる | deadwood

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。