コマンドラインから実行できる多くのコマンドは引数を指定して実行しますが、Rubyのスクリプトを実行する際も、引数を利用できるのをご存じでしょうか。もしサーバー管理などで処理を自動かするためにRubyのスクリプトを利用する場合、引数で処理を切り替えられれば便利です。さらに時刻指定で実行する仕組みにも利用できます。
今回はコマンドラインから引数を指定し、それをRubyのプログラムの中で利用する方法を解説します。
ターミナルで使えるコマンドの特徴
Rubyは、デスクトップのアイコンをクリックするとスクリプトを実行するためのウィンドウが表示されるようなアプリケーションではありません。ターミナルやコマンドラインから引数を指定して実行するコマンドです。では、コマンドラインから指定できる引数とはどのようなものでしょうか。
普段からコマンドラインを利用されている方にとっては常識かもしれませんが、慣れていない方にとっては何のことか解らないかもしれません。まずはコマンドラインから指定した引数とはどのようなものかについて解説します。
ターミナルから実行できるコマンドの特徴
Rubyを実行する場合、LinuxやmacOSではターミナルを、Windowsではコマンドプロンプトを使用します。なおこのような使い方はキャラクターユーザインターフェース(CUI)と呼ばれる方法で、キーボードからコマンド名や引数の文字を打ち、最後にエンターキーによりそのコマンドを実行します。
例えば、ターミナルからRubyを実行する際、「ruby」に続いてスペースで開けてプログラムを書いたファイル名をキーボードから打ち込みます。そのうえでエンターキーを押すとそのファイルに記載されたrubyのプログラムが実行されます。
引数にsample.rbを指定してrubyコマンドを実行する例
$ ruby sample.rb
引数の数はコマンドによって決まっている
先ほどrubyコマンドの実行例を用いて引数の使い方を紹介しましたが、ターミナルやコマンドプロンプトから実行できるコマンドの多くは、複数の引数を指定できます。そのようなコマンドの中には、何番目の引数で何を指定するかが決まっているものもあります。
例えばLinuxやmacOSでファイルをコピーするコマンド「cp」の引数は、1番目の引数がコピー元のファイル名、2番目の引数がコピー先のファイル名です。
Linuxのcpコマンドの基本的な使い方
cp コピー元 コピー先
引数をプログラムの中で扱うには
多くのプログラミング言語でコマンドラインの引数を参照する仕組みが用意されており、引数を取り込んで処理するプログラムが作れます。例えばRubyのスクリプトを実行する際、rubyコマンドとスクリプトのファイル名に続いて、引数を指定できます。
引数を取り込むRubyのプログラムを実行する例
ruby ファイル名 引数1 引数2 ….
この場合、コマンドラインで指定された引数は、組み込み変数の$*などに格納されているので、プログラムの中で扱うことが可能です。さらに、Linuxなどでスクリプトファイルを実行可能形式にしておくことで、コマンドと同じように実行できます。この組み込み変数の使い方は、次から詳しく解説します。
Rubyで引数を利用するには
先ほど説明したようにコマンドラインからRubyを実行する際、プログラムを書いたスクリプトファイルに加えて、そのスクリプトの処理に利用する引数を指定できます。そして、その引数は組み込み変数の$*、またARGVを利用することでRubyプログラムの中で利用可能です。
次からRubyで引数を利用する方法について紹介します。
組み込み変数$*を利用する
組み込み変数$*は、Rubyを実行した際にスクリプトファイルに続く引数を格納した配列です。そしてグローバル変数と同じようにプログラムのどこからでも参照できます。
例えば次のようにrubyを実行した場合、組み込み変数$*には、スクリプトファイルの次から続く引数が文字列として格納されます。
$ ruby スクリプトファイル 引数1 引数2 引数3
上記の場合、$*の内容は次のとおりです。
[“引数1”, “引数2”, “引数3”]
組み込み変数$*を利用して引数を参照する例
$*.each do |argv| puts argv end
上記のプログラムの実行例
$ ruby rubyscript.rb a1 b2 c3 a1 b2 c3 $
組み込み変数ARGVを利用する
先ほど紹介した$*の別名がARGVです。そのため、$*の代わりにARGVを利用して、引数をR利用するRubyのプログラムを利用できます。
なお、多くのプログラミング言語に影響を与えているC言語ではargvに引数が格納されています。そのため、他のプログラミング言語を学んだことがある方には、ARGVの方が理解しやすいでしょう。
C言語のargvを利用した例
#include int main( int argc, char *argv[] ) { int i; for(i=0; i<argc; i++) { printf("%s\n", argv[i]); } }
Rubyのスクリプトをコマンドとして使う
コマンドラインから複数の引数を使うRubyのスクリプトを利用するなら、コマンドのようにファイル名だけで実行できると便利です。もしLinuxなら、そのようなスクリプトを実行可能に設定できます。次からRubyのスクリプトをコマンドのように使う方法について紹介します。
ファイルを実行可能にする
Linuxで使われるファイルには、読み込み、書き込み、実行可能の3つのパーミッションがあり、chmodコマンドで変更できます。
例えばLinuxで使われるシェルスクリプトは、Linuxのコマンドを実行順に記述したテキストファイルですが、実行可能のパーミッションを設定することで、ファイル名だけで実行可能にできます。そして、テキストファイルを実行可能にするには、chmodコマンドに+xオプションを設定します。
ファイルを実行可能にする例
$ chmod +x shellscript
実行可能かをチェックする
$ ls -l 合計 4 -rwxrwxr-x 1 user user 51 M月 DD hh:mm rubyscript
実行可能になる前は「-rw-rw-r–」です、実行権のxが追加されて「-rwxrwxr-x」になります。
ただし、これだけではシェルスクリプトとして実行されるだけで、Rubyを実行できる訳ではありません。Rubyのスクリプトを実行できるようにするには、もうひと手間必要です。
スクリプトを実行するためのひと手間
先ほどスクリプトファイルを実行するためのコマンドを紹介しましたが、これだけではシェルスクリプトとして実行されてしまい、Rubyは実行されません。シェルではなくRubyを実行するには、1行目に次のように記述します。
#!/usr/bin/ruby
これがあるとシェルは、これが/usr/bin/rubyで実行されるスクリプトファイルと判断し、実行を引き継ぎます。なお、次のようにオプションを設定して実行することも可能です。
#!/usr/bin/ruby -d
引数を指定して実行する例
Rubyのスクリプトファイルを実行できるようにしたら、そのファイル名に続いて引数を指定し、コマンドラインから実行できます。
実行可能なRubyスクリプトの例
#!/usr/bin/ruby $*.each do |argv| puts argv end
上記の例の実行例
$ chmod +x rubyscript $ ./rubyscript in1 in2 in3 in1 in2 in3 $
上の例ではchmodコマンドで「+x」オプションで実行可能にしましたが、「777」オプションなどで実行可能にできます。詳しくはchmodコマンドのマニュアルをチェックしてください。
まとめ
今回紹介したRubyの引数を使ったプログラムは、そのスクリプトファイルをまるでコマンドのように利用する際に利用できます。また、ターミナルなどから使うことも可能ですが、Linuxのcronなど、時刻指定で実行するコマンドとしても利用可能です。
なおRubyにはLinuxサーバーのファイルを操作したり、調べたりする機能もあります。そのような機能を使ったプログラムの内部で引数により使い処理を切り替えたり、検査対象を指定するなど、工夫次第でいろいろなスクリプトを作ることが可能です。ぜひ、そのようなRubyのスクリプトに今回紹介したコマンドラインの引数を参照する機能を利用してください。