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.

Rubyのコマンドラインオプションを最短で扱う方法

Posted at

はじめに

コマンドラインからオプション付き引数を指定して実行する際の実装方法についての記事になります。
オプション付きの引数とは、例えば $ruby sample.rb -a 1 で実行する場合は -a がオプションで 1 がその値になります。
Rubyをでこれを扱うためには optparse が必要になります。(Pythonでいうとargparse と同様)
コマンドラインから受け取った値を実行時に {a: 1} のような形で扱いたいと思っていました。
Rubyのリファレンスを参照したところ説明がとても充実していたのですが、実際に使用するまでには少々遠回りでした。
本来はリファレンスを熟読してから使用するべきですが、とりあえず使いたい方(と将来の自分)に向けて最短方法を記載します。

動作確認環境

  • ruby 3.2.2

使い方

コマンドラインから受け取った値を変数に入れることにフォーカスすると、サンプルコードは下記になります。

sample.rb
# ライブラリ読み込み
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のコマンドラインオプションを扱う最短の方法を記載しました。
とりあえず使うなら上記で十分ですが、より理解するためにはリファレンスの理解が必要です。
自分が所望する使い方は最後の方に書いてあったので、長くても最後まで読むことが大事だと感じました。

参照

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?