読者です 読者をやめる 読者になる 読者になる

ネット偽善者でもいいじゃない

悩んでるなら面白いマンガ読もう

RubyでARGVを使う時に引数指定するならARGV.getoptsが便利

Ruby プログラミング

rubyコマンドの際、引数にオプションを指定すると便利

Raspberry Piのカメラモジュールを使っています。

ディレクトリ内にjpgファイルなどを置いて、rubyによって呼び出したりなんか作業するのに rubyファイル内でARGVを使うとファイルの呼び出しが可能なことはわかったが

rubyコマンドの引数の順番がバラバラでも対応出来るように、探してみたところgetoptsというのが便利っぽかった

Ruby - OptionParser よりも指定が楽な ARGV.getopts のオプション指定(ロング/ショートも) - Qiita

Ruby - ARGVの処理にOptionParserを使ってるライバルをバックミラーから高速に消し去るARGV.getoptsの使い方 - Qiita

ただ、パッと見ただけでは使い方が良く分からなかったのでメモ これ実際、色々打って試してみるのが一番良いです、眺めていても全くわからなかったです(^_^;)

「:」をつけないと、ただのtrueかfalseを返す、「:」をつけるとハッシュになる

わかりやすくするためにとりあえずひとつだけ指定してみた

# coding: utf-8

require 'optparse'
params = ARGV.getopts('japan:')
p params

実行結果は

同じ文字(japanのa)は最初のだけ適用される

$ ruby test.rb

{"j"=>false, "a"=>false, "p"=>false, "n"=>nil}

-j をつけると、jにtrueが入る

ruby test.rb -j
{"j"=>true, "a"=>false, "p"=>false, "n"=>nil}

-japのようにいっぺんに指定も出来る

$ ruby test.rb -jap
{"j"=>true, "a"=>true, "p"=>true, "n"=>nil}

同じ文字は何度使ってもtrue

$ ruby test.rb -jaaaaaaa
{"j"=>true, "a"=>true, "p"=>false, "n"=>nil}

# もちろん、-japaのように指定も出来る
$ ruby test.rb -japa
{"j"=>true, "a"=>true, "p"=>true, "n"=>nil}

nに関しては、コロン(:)が付いてるのでさらに要素を指定して代入しなければエラーになる

# -n に何も指定しなかった場合
$ ruby test.rb -n 
test.rb:5:in `<main>': missing argument: -n (OptionParser::MissingArgument)

# -nに task を指定した場合、nのハッシュ要素として task が挿入される
$ ruby test.rb -n task
{"j"=>false, "a"=>false, "p"=>false, "n"=>"task"}

ちなみに-nにtaskをくっつけても(スペースを入れなくても)可能

$ ruby test.rb -ntask
{"j"=>false, "a"=>false, "p"=>false, "n"=>"task"}

以上を踏まえると次のようなことも出来る

$ ruby test.rb -japan goal
{"j"=>true, "a"=>true, "p"=>true, "n"=>"goal"}

コロンがついていない要素に、値を指定するとコロンの要素が入らなくなったりしてめんどいので注意

$ ruby test.rb -j blue -n aaa
{"j"=>true, "a"=>false, "p"=>false, "n"=>nil}

# jには要素は入らないはずなので、blueと指定してしまうと -nのハッシュに値が代入されなくなってしまう、これはよくわからなかったので要調査

ハイフンを2つ繋げると、単語1つ認識の入力になる コマンドオプションの, -h と --help が同じ動作をするような感じです しかし、今回は'japan:'としか指定していないのでエラーになります

$ ruby test.rb --japan chek
test.rb:5:in `<main>': invalid option: --japan (OptionParser::InvalidOption)

これを回避するために、-n: も記述してあげます。test.rbを書き換えます これで通るようになります

# test.rbを以下のように訂正

# coding: utf-8

require 'optparse'

params = ARGV.getopts('n:', 'japan:')
p params

これで通るようになります

$ ruby test.rb --japan goal
{"n"=>nil, "japan"=>"goal"}

ただ、これに関してはちょっとバグの原因になるので仕様変わらないのかな?という感じです (この次点で僕は ruby 2.1.1を使ってます)

以上備忘録がてら

たのしいRuby 第4版