はじめに
今回はHappiness Chainの課題(カレンダー作成)でコマンドラインからオプションとその引数を受け取る必要があったので、Ruby optparse ライブラリの使い方について書いていきます。
環境
- OS: macOS 26.6.2
- Ruby version: ruby 3.3.12
ARGVについて
後述するARGVについても知らなかったので、前提知識として記述しておきます。
ARGVとは
Ruby スクリプトに与えられた引数を表す配列のこと。
ARGVは引数を与えられない場合、空の配列。
引数に任意の値を設定すると、配列に値が設定されます。
p ARGV
$ ruby argv.rb
=> []
$ ruby argv.rb Bob 35
=> ["Bob", "35"]
ARGVだけだと、「-a」も単なる文字列の引数として扱われます。
そこでoptparseの出番です。
optparseとは
コマンドラインのオプションを取り扱うためのライブラリ。
Ruby スクリプトに与えられた引数をオプションとして扱うことができるよう
になります。※オプション引数も受け取ることができる。
オプションや引数が想定通りかを判定することもできるようになります。
基本的なoptparseの使い方
- OptionParser オブジェクト opt を生成する
- オプションを取り扱うブロックを opt に登録する
- opt.parse(ARGV) でコマンドラインを実際に parse する
require 'optparse'
opt = OptionParser.new
opt.on('-a') {|v| p v }
opt.on('-b') {|v| p v }
opt.parse!(ARGV)
p ARGV
$ ruby sample.rb
=>true
=>true
=>[]
$ ruby sample.rb -a Alice -b Bob
=>true
=>true
=>["Alice", "Bob"]
コード詳細
まず optparseライブラリ を requireして、
OptionParse オブジェクトを生成します。
require 'optparse'
opt = OptionParser.new
OptionParseのインスタンスメソッドであるonメソッドを使用して、
オプションを指定します。ブロックへは指定されたオプションが指定されたことを示すtrueが渡されます。
ちなみにこのブロックは、この時点では実行されません。(登録されるだけ)
後述するparseメソッドが実行されるかつ、オプションが指定されていた場合、
実行されます。
opt.on('-a') {|v| p v }
opt.on('-b') {|v| p v }
parseメソッドを使用して、コマンドライン(ARGV)の解析を行います。
parse!(破壊的メソッド)を使用した場合、オプションが取り除かれます。
※parseメソッドを使用した場合は、オプションは取り除かれません。
opt.parse!(ARGV)
p ARGV
指定オプションエラー
指定したオプションと違うオプションを指定した場合、
例外 OptionParser::InvalidOption が発生します。
$ ruby sample.rb -c
sample.rb:7:in `<main>': invalid option: c (OptionParser::InvalidOption)
オプション記憶
OptionParser はオプションを記憶しないため、オプションによる条件判断を行うには、別途他の変数に渡しておく必要があります。
オプションが指定されていない場合、paramsが空になるので、
オプションが指定されたかどうかを判断することができます。
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 sample2.rb -a Alice -b Bob
=> ["Alice", "BoB"]
=> {:a=>true, :b=>true}
$ ruby sample2.rb
=> []
=> {}
オプション引数
オプションに引数が付与されているかどうかを判断するために、
onメソッドにオプション引数を追加することができます。
オプション引数を追加した場合、
そのオプションは引数を受け付けることの指定となり、
オプション引数が指定されなかった場合、例外エラーが発生します。
require 'optparse'
opt = OptionParser.new
opt.on('-a VAL') {|v| p v } # <- " VAL" を追加
opt.on('-b') {|v| p v }
opt.parse!(ARGV)
p ARGV
$ ruby sample3.rb -a
sample3.rb:9:in `<main>': missing argument: -a (OptionParser::MissingArgument)
オプション引数が必須ではないことを、[ ]をつける必要があります。
オプション引数を指定しない場合、ブロックには nil が渡ります。
require 'optparse'
opt = OptionParser.new
opt.on('-a [VAL]') {|v| p v } # <- [VAL] を追加
opt.on('-b') {|v| p v }
opt.parse!(ARGV)
p ARGV
$ ruby sample4.rb -a
=> nil
=> []
=> {}
ロングオプション引数
OptionParserのonメソッドにはショートオプションだけではなく、
ロングオプションも設定することができます。
また、ロングオプションは省略することが可能です。
以下の場合、--foo は --fまで省略できます。
require 'optparse'
opt = OptionParser.new
opt.on('-a', '--foo') {|v| p v }
opt.on('--bar') {|v| p v }
opt.parse!(ARGV)
p ARGV
$ ruby sample5.rb -a Alice --foo Falco --bar Bob
=> "true"
=> "true"
=> "true"
=> ["Alice", "Falco", "Bob"]
$ ruby sample5.rb --f Falco
=> "true"
=> ["Falco"]
参考文献
公式リファレンス