Rubyを学習する過程で使用したoptparse
の使い方を解説したいと思います。
本記事に間違った内容が含まれている場合、ご指摘いただけますと幸いです。
optparse
とは
公式リファレンスを見ていただければわかりますが、要するにコマンド実行時のオプションを自分で作るためのライブラリです。
オプションというのは、コマンドを実行するときにその後に-
や--
をつけて指定できるものです。
たとえばGitのbranch
コマンドでは、以下のように-d
(--delete
)オプションの後にブランチ名を指定することでそのブランチを削除できます。-d
がショートオプション、--delete
がロングオプションです。
git branch -d ブランチ名
git branch --delete ブランチ名
上の例ではオプションのあとにブランチ名を指定していますが、これは引数となるものです。引数は省略できる場合もあります。オプション(+引数)
で色々な操作が実現可能になります。optparse
で自分の好きなオプションを作成可能です。
optparse
の使ったオプションの作成方法
require
します。
+ require 'optparse'
OptionParser.new
ブロック内に必要なオプションを定義します。
引数なしのオプションを作成する場合はオプション名のみ、引数ありのオプションを作成する場合はオプション名と引数名を指定します。
下記の例は、引数に指定した値をx
にプラスする処理です。-a
オプションのあとに引数のnumber
を書いています。
require 'optparse'
+ x = 10
+ options = {} # 引数の値を入れるための空の配列を作成
+ OptionParser.new do |opts|
+ opts.on('-a number') do |number|
+ options[:number] = number.to_i
+ x += options[:number]
+ end
+ end.parse!
+ puts x
$ ruby optparse.rb -a 10
20
コードの役割
options = {}
引数を入れるための空の配列を作成しています。
options[:number] = number.to_i
引数は文字列として扱われるので、number.to_i
で数値型に変換しています。もしこの行を以下のように書くとエラーになります。
x += number
$ ruby optparse.rb -a 10
optparse.rb:10:in `+': String can't be coerced into Integer (TypeError)
ただし、以下のように引数の型を指定しておけばまた別です。
opts.on('-a number', Integer) do |number|
options[:number] = number
x += options[:number]
end
end.parse!
この行はARGV(オプションと引数の配列)から引数だけを取り出します。この行まで来たらブロック内の処理が行われます。もし.parse!
の部分がなかったら以下のようにブロック内の処理が行われません。
require 'optparse'
x = 10
options = {} # 引数の値を入れるための空の配列を作成
OptionParser.new do |opts|
opts.on('-a number') do |number|
options[:number] = number.to_i
x += options[:number]
end
- end.parse!
+ end
puts x
$ ruby optparse.rb -a 10
10
補足
ロングオプション
指定する場合は以下のようになります。
- opts.on('-a number') do |number|
+ opts.on('-a', '--add number') do |number|
$ ruby optparse.rb --add 10
20
引数なしの場合
本記事では引数必須のオプションを作成したので、引数を指定しないとエラーになります。
$ ruby optparse.rb -a
optparse.rb:16:in `<main>': missing argument: -a (OptionParser::MissingArgument)
$ ruby optparse.rb --add
optparse.rb:16:in `<main>': missing argument: --add (OptionParser::MissingArgument)
本記事では解説しませんが、省略可の引数ありのオプションを作成する場合は、引数を[]
で囲みます。
ヘルプ
オプションの説明を加えておくことで、-h
(--help
)でコマンドの説明を出力できます。
opts.on('-a', '--add number', 'add') do |number|
$ ruby optparse.rb -h
Usage: optparse [options]
-a, --add number add
$ ruby optparse.rb --help
Usage: optparse [options]
-a, --add number add
以上になります。
参考記事
- コマンドライン引数によるオプションに対応する (optparse) - まくまくRubyノート
- Rubyのoptparseについて掘り下げてみる - あきろぐ
- Ruby実行時のオプションをよろしく解析してくれるoptparseを使ってみる - kk_Atakaの日記
- OptionParser | Ruby API (v3.2)
- ruby で ARGV をうけるコマンドっぽいものを作ってみる | DriftwoodJP
- ruby コマンドライン引数 optparseの利用 スクリプトの書き方 | バイオインフォ 道場 [bioinfo-Dojo]
- optparseライブラリを使う(in Ruby) | 雑記帳
- RubyのOptionParserの底力を知る - ザリガニが見ていた...。
- 初心者でもわかるRubyのコマンドラインオプション - すずかのプログラミング勉強記