0
0

Rubyのプログラムを実行する際にオプションを指定して引数を渡す方法。【optparseの使い方]

Posted at

optparseの使い方について自分なりにまとめてみました。

はじめに

Rubyで作成したプログラムを実行する際に引数を渡して実行したい場合

$ sample.rb hello

のような形で実行するとプログラム内で配列ARGVで引数を使うことができます。

optparseでオプションを指定する

上記のようなやり方の他、optparseという標準ライブラリを使うことで引数の前にオプションを指定して実行する方法があります。
$ sample.rb -m hello
みたいな感じです。-mがオプションになります。

この方法を使うメリットとして

  • オプションによって引数が何を意味をするのかがわかりやすくなる。(バージョンを引数にしたい場合オプションを-vにするなど)
  • 引数が複数ある場合、通常のやり方だと定義した順番に引数を記述しないといけないが、オプションで指定する場合、順番を気にしなくて良い。

optparseの使用方法

以下利用方法になります。

1. プログラム内にoptparseを読み込む

require 'optparse'

組み込みライブラリではないのでrequireで読み込む必要があります。

2.optのインスタンスを作成する

opt = OptionParser.new

3. 取り扱うオプションを指定する

opt.on('-a')

実際にこの時点までの記述にp ARGVを足したコード

require 'optparse'
opt = OptionParser.new
opt.on('-a')
p ARGV

をオプション指定して実行すると

sample.rb -a hello
# => ["-a", "hello"]

となり、-mがオプションとして扱われておらず、ARGVには-mhelloの二つの引数が渡されているような状態になっています。
ここから-mのオプションの部分を取り除いて、ARGV[0]=="hello"の状態にするには

4. opt.parseでオプションを取り除く

opt.parse!(ARGV)

上記の記述でARGVはオプション-mを取り除いたあとの状態の配列になる
ちなみに!をつけないと破壊的メソッドにならないため、
ARGVの状態は変わらない。
上記の記述p ARGVの前に加えて実行すると

sample.rb -a hello
# => ["hello"]

となり、引数が正しい形で受け取ることができる。

これでオプションを指定してプログラムに引数を渡すことが可能になった。

補足

オプションが複数あるときに指定されたオプションの有無によってプログラムの処理を変えたい場合

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

という記述をするとブロックのvの中にオプションがあった場合true,無しで実行された場合nilが入る
オプションを複数使う場合には
params = {}などの空のハッシュを定義しておいて

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

のように記述しておくと
各ハッシュの要素にキーに指定したオプションの有無が入るので
if params[:a]のように条件分岐などする際に利用できる。

オプションをロングバージョンでも指定できるようにする

バージョンを指定するようなオプションの場合-vなどと指定することが多いと思うが、こういう場合に--versionでも同じく指定できるようにしたいときは

opt.on('-v', '--version')

とすると-v--versionのどちらでも指定できるようになる。

まとめ

以上になります。
自分なりに学習したことをまとめてみました。
間違っている部分がありましたら教えていただけると幸いです。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0