コマンドラインとの情報のやりとり

コマンドライン引数

Rubyプログラムを実行するときに、プログラム自身に与えた引数を Rubyプログラムから利用できる。たとえば、

% ./test.rb a b c d

のように起動した場合、与えた引数 `a', `b', `c', `d' は、自動的に配列変数 ARGVに代入される。 具体的には、

ARGV
ARGV[0] ARGV[1] ARGV[2] ARGV[3]
"a" "b" "c" "d"
ARGV[0] = "a"
ARGV[1] = "b"
ARGV[2] = "c"
ARGV[3] = "d"

というふうに値が格納される。これを利用すると、プログラム起動時に 与えた情報で動作を決定するものが作れる。

たとえば、1から指定した数までの総和を求めるときに、

% ./sum.rb 100

で100までの総和を求めるようなプログラム (sum.rb)は以下のように書ける。

#!/usr/koeki/bin/ruby
# coding: utf-8

if ARGV[0] == nil
  STDERR.puts "起動時に指定した値までの自然数を全部足します."
  STDERR.puts "例: ./sum.rb 100  --- 1から100までの総和を求める."
  exit(1)
end

sum = 0
goal = ARGV[0].to_i	# 文字列なので整数に直す

goal.downto(1) do |x|
  sum += x
end

printf("1から%dまでの自然数の総和は%dです\n", goal, sum)

STDERR

プログラム先頭で ARGV[0]nil か どうか比較しているが、これは対応する引数が与えられなかった場合の 判定である。コマンドラインで引数を指定しなかった場合(あるいは 個数が足りない場合)の処理も考慮する必要がある。

このように、プログラムを起動するときに利用者が起動方法を間違えた 場合には適切なメッセージを端末に出力する必要がある。そのような場合は たんに printf するのではなく、 STDERRに対してprintfする 必要がある。たんに printf すると、

% ./sum.rb > hogehoge

のように起動した場合、エラーメッセージさえもファイル (上記の場合hogehoge)に書かれるため、 利用者の目に触れずに終わってしまう。

終了ステータス

Rubyプログラムの実行が終わるときに、プログラム全体が「うまくいった」 か「うまくいかなかったか」をシステムに対して教えることができる。この情報 のことを終了ステータスという。

終了ステータスは整数で表し、

とする決まりになっている。sum.rb でエラーメッセージを表示したあと、

exit(1)

としているのは、システムに対し「予定した仕事ができずに終わっちゃった」 ことを示すためである。

exitは、直ちにプログラムの実行を終了し システムに終了コードを返す。プログラム実行中にエラーが発生した 場合などはプログラムを継続する意味がなくなるため、exitを利 用して終了する。


本日の目次