blochの日記

自虐ネタ以外のぐちは書かないようにしましょう

下位のプログラムにコマンドを渡す

基本的なルーチンをスクリプト(下位)で書いて、それをコマンドシェルのfor/Lコマンド(上位)で回す、などと言うことが多々あるが、困るのは下位のスクリプトを細かく書き過ぎると、使うたびに修正が必要になることである。
下位のスクリプトで何かサブの量を測るルーチンを書いたとして、それを測る装置を変えたり、一方測らなくて良かったり、頻繁に変わることに対処出来ないものか? もちろん、引数を付けて下位スクリプトを呼び出してスイッチすれば簡単なのだけれど、「サブの量を測るルーチン」のパラメタや装置までいろいろ変えるとなるとスイッチしきれない。いろいろ考えた挙句、到達したのは、

上位のスクリプト環境変数に「コマンド+パラメタ」をセットしてしまう、と言うことだった。

すると、下位側で、%環境変数% とやるだけで実行してくれる。これなら、測定パラメタも含めて自由に上位側で書けるし、測定不要なら変数をクリヤすれば良いだけ。
一つ、注意しなければならないのは、試して分かったことだけれど、サブの量を測るコマンドを二つ実行しようとして「&」で区切って一つの変数に収めようとしても、&より前のコマンドしか変数にセットされない。クォーテーションマークで囲んでしまうと、下位側での実行時にエラーになる。愚直に二つの環境変数を用意して、二つ別々に実行させないとだめ。不要なら変数にセットしなければ良いだけなので、通し番号でもつけて %変数1% & %変数2% & %変数3% としておくと良い。

【後記】コメントをいただきました。「^&」のエスケープで&を環境変数にセットできました。