はじめに
コマンドラインからオプション付き引数を指定して実行する際の実装方法についての記事になります。
オプション付きの引数とは、例えば $ruby sample.rb -a 1
で実行する場合は -a
がオプションで 1
がその値になります。
Rubyをでこれを扱うためには optparse が必要になります。(Pythonでいうとargparse と同様)
コマンドラインから受け取った値を実行時に {a: 1}
のような形で扱いたいと思っていました。
Rubyのリファレンスを参照したところ説明がとても充実していたのですが、実際に使用するまでには少々遠回りでした。
本来はリファレンスを熟読してから使用するべきですが、とりあえず使いたい方(と将来の自分)に向けて最短方法を記載します。
動作確認環境
- ruby 3.2.2
使い方
コマンドラインから受け取った値を変数に入れることにフォーカスすると、サンプルコードは下記になります。
# ライブラリ読み込み
require 'optparse'
# 変数へ代入
params = ARGV.getopts("a:b:", "foo", "bar:")
# 変数の使用
p params
実行時すると下記のようになります。
$ ruby sample.rb -a 1 --foo --bar xxx
{"a"=>"1", "b"=>nil, "foo"=>true, "bar"=>"xxx"}
ポイントは下記になります。
- optparseをrequireすることでARGVに機能が追加されます
- ARGV.getoptsで引数に渡したものだけ使用可能になります
- この状態で未指定の-bをコマンドラインから指定するとエラーになり、誤入力を防げます
- 可変長引数です。ブロック{}ではありません。
- デフォルト値を設定できます
- 引数は文字列型になります(1は"1")
リファレンスの読み方の補足
- オプション定義の
opt.on('-a') {|v| p v }
について- 上記でも定義できるのですが、上記の使用範囲なら
ARGV.getopts()
で十分です - 最初はブロック内で変数を代入できること期待したのですが、こちらはコマンドラインからの入力の有無をboolで返すものになります
- ブロックはパース実行時まで処理されません
- 上記でも定義できるのですが、上記の使用範囲なら
- パース実行の
opt.parse!(ARGV)
について- こちらは-aなどのオプションの文字列を削除して値だけを配列に残してくれます
おわりに
Rubyのコマンドラインオプションを扱う最短の方法を記載しました。
とりあえず使うなら上記で十分ですが、より理解するためにはリファレンスの理解が必要です。
自分が所望する使い方は最後の方に書いてあったので、長くても最後まで読むことが大事だと感じました。