Rubyでシェル変数を使う

Rubyでシェル変数を使う方法には、Rubyプログラムの引数として渡すか、シェル変数を環境変数にするかの2通りがある。

引数として渡す場合、RubyではARGVを使って値を取得する。

環境変数にする場合、RubyではENV['変数名']で値を取得する。

引数として渡す方が簡単な気もするが、引数に渡したファイル名でARGFを使いたい場合は、引数をファイル名以外に渡せない。ARGFを使うことをあきらめ、3つ目の引数にファイル名を渡してFile.open(ARGV[2])のように扱うしかない。しかし、環境変数を利用してRubyでシェル変数を使う方法を採用すると、引数に渡すものがなくなるので、ファイル名を唯一の引数として指定できる。

ARGFを使えるようになると、Rubyの-iオプションも使えるようになる。ファイルの内容を置換等して編集後、そのままファイルを保存したい場合、in-placeモードでRubyを実行する。Rubyワンライナーで行単位で決まったパターンで置換編集する場合はARGFやFileクラスを使う必要がないが、パターンを外部からパラメータとして渡したい場合や、複数行に渡る正規表現の置換をするために全行を一度に取得する場合は、ARGF等を使わなければならない。

例えばtest.txtの"should be "という文字列を取り除きたいという要件であれば、一行ずつ置換していけばいいので、ARGFやFileクラスの話は登場せず、in-place置換は簡単にできる。

しかし、"should be "という文字列自体を引数として渡したいとなると対応できなくなる。"should be"もファイルとして見られてしまうからだ。

File.openで書くと置換自体はできるが、in-place編集はできない。

環境変数を使ってRubyに渡す引数をファイル名だけにし、ARGFを使うとin-place編集できる。

もう一つの例として、複数行に渡る正規表現の置換をする場合も見てみる。test.txtの[start]と[end]で囲まれた箇所を標準入力で渡した内容で書き換えたい。どんなファイル名でも、またどんな置換箇所の識別子でも対応できるようにするため、ファイル名および[start]と[end]はRubyの外から渡さなければいけないとする。こちらも先ほどと同じく、File.openを使ってもin-place編集できないが、ARGFを使うと可能になる。ARGFを使うため、環境変数で変数をRubyに渡さなければならない。

-Linux, Ruby
-,