0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

optparseについて

Last updated at Posted at 2023-10-30

optparseとは

Rubyでコマンドライン引数を扱うための標準ライブラリ。

例えば、test.rbというファイルを実行するとしてruby test.rb -a 100のようにコマンドライン引数で値を渡すことができる
-a 100の中身はファイル内で使用することができる

使い方

  1. OptionParseオブジェクトoptを生成する
  2. オプションを取り扱うブロックをoptに登録する
  3. opt.parse(ARGV)でコマンドラインを実際にparseする

1. OptionParseオブジェクトoptを生成する

sum.rb
require 'optparse'
opt = OptionParser.new

上記でoptparseライブラリを読み込み、変数optにOptionParseクラスから生成したインスタンスを格納している
このインスタンスに対して操作を加えることでオプション引数を扱えるようになる

2. オプションを取り扱うブロックをoptに登録する

sum.rb
require 'optparse'
opt = OptionParse.new

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

OptionParse#onメソッドの引数でオプション-a-bを定義し、引数が指定されたときの処理をブロック内に記述する
ブロックの引数にはオプションが指定されたことを示すtrueが渡される
※ただし、この時点ではブロックは実行されない。実行されるのは、後述するOptionParse#parseが呼ばれたとき

3. opt.parse(ARGV)でコマンドラインを実際にparseする

  • デフォルトのオプションや変数を設定する
    OptionParser#parse!を使い、コマンドラインの解析を行う
    以下を追記してruby sum.rb -a 10 -b 20を実行する
sum.rb
require 'optparse'

#create opt object
opt = Optionparser.new

#register options
opt.on('-a') {|v| p v }
opt.on('-b') {|v| p v }

#parse
opt.parse!(ARGV)
p ARGV
結果
["10", "20"]

コマンドラインの引数の値を取得することができた

ちなみに、opt.parse(ARGV)とすると値だけでなくオプションも取得することができる

結果
["-a", "10", "-b", "20"]

オプションの記憶

OptionParseはどのオプションが指定されたのか記憶しない
そのため後で処理が必要なものはコンテナに格納する必要がある

sample.rb
require 'optparse'
opt = OptionParser.new

params = {}

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

opt.parse!(ARGV)
p ARGV
p params

↓ 実行結果

ruby sample.rb -a foo bar -b baz
# => ["foo", "bar", "baz"]
     {:a=>true, :b=>true}

ロングオプションを定義する

例えば、ショートオプションだけでなくロングオプションを定義したい場合はonメソッドでオプションを定義するときにショートオプションと一緒にロングオプションとして渡したい値を指定する

以下のようにすることで、ショート、ロングバージョンどちらでもオプションを指定することができる

ロングオプション
require 'optparse'
opt = OptionParse.new

opt.on('-a', '--all'){|v| p v }
opt.on('-b', '--before'){|v| p v }
opt.parse(ARGV)
p ARGV
結果
ruby sample.rb --all foo --before bar
true
true
["--all", "foo", "--before", "bar]

受け取る引数のクラスを指定する

あるオプションの引数で受け取るクラスを限定したい時は下記のように記述する

sample.rb
require 'optparse'
opt = OptionParser.new

option = {}
# 引数はIntegerのみ
opt.on('-a', '--all=N', Integer, 'description:a') {|v| option[:a] = v }
# 引数はStringのみ
opt.on('-b', '--before=S', String, 'description:b') {|v| option[:b] = v }
opt.on('-c [VAL]', '--ccc', 'description:c') {|v| option[:c] = v }
opt.parse!(ARGV)
p option

↓ 実行結果

$ ruby sample.rb -a 1 -b aaa
{:a=>1, :b=>"aaa"}

$ ruby sample.rb -a aaa
sample3.rb:7:in `<main>': invalid argument: -a aaa (OptionParser::InvalidArgument)

$ ruby sample.rb -b 1
{:b=>"1"}

Integerクラスを指定すると、文字列が引数としてきたらエラーを返す
Stringクラスを指定すると数値を引数に渡した場合でも文字列として受け取る

便利なARGV機能

今までの方法でコマンドのオプションや引数を処理することができるが、もっと簡単に扱えるOptionParser::Arguableモジュールのgetoptsメソッドがある
getoptsモジュールを使用することで、ワンラインでコードでオプションと引数を指定することができ、受け取ったものをHashとして受け取ることができる

使い方

ショートオプション、またはロングオプションを指定することができる。引数が必要なオプションにはコロンをオプションの後ろにつける
オプションはopt.onのときと異なり、1つ1つ指定するのではなくまとめて記述するためgetoptsメソッド使うと簡単になる

sample.rb
require 'optparse'

# 引数なしのオプションa, 引数ありのオプションbを指定
params = ARGV.getopts("ab:")
p params

↓ 実行結果

$ ruby sample2.rb -h
Usage: sample2 [options]
    -a
    -b VAL

$ ruby sample2.rb -a -b bbb
{"a"=>true, "b"=>"bbb"}

ロングオプションを使いたい場合も同様。ショートオプションが不要な場合は、""のように空文字を渡してあげる必要がある

ショートオプションのときのようにまとめてオプションは指定せず、分けて書く。

sampl.rb
require 'optparse'
# ショートオプションなし、ロングオプション引数なし or あり
params = ARGV.getopts("", "all", "before:")
p params

オプションのデフォルト値も指定することが可能

sample.rb
require 'optparse'
# ショートオプションなし、ロングオプション引数あり、デフォルト値あり
params = ARGV.getopts("", "all", "before:", "maxsize:1024")
p params

参考文献

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?