フィルタースクリプトなシェルスクリプト

今日はじめて気付いたので、忘れないうちにメモ。

bashとかでフィルターのスクリプトを書くとき、
cat $@ | hoge | huga
とか書くと便利なことを今日知った。
スクリプトの引数がなければ$@が無視されるので(man bash参照のこと)、catが標準入力を読む。つまり、スクリプトに渡された標準入力に対して動作する。
スクリプトに引数としてファイル名をいくつか与えると、$@にすべての引数が入るので、普通に引数を処理する。
別にcatじゃなくても、sedでもawkでもgrepでもいけると思う。

例えば、 
nkf $@ | less
というスクリプトを(たとえばnkflessと言う名前で)用意しておけば、 nkfless text でも cat text | nkfless でも両方使える。
ちなみに、bashでなくdashでも使えたので、たぶんshでもいけるかも。
(でも、lessのこんなことは、LESSOPEN=”|nkf %s” みたいな環境変数で本当はできるんですけどね、、、。)

引数の個数を判断して、while read line (場合によってはcat – | と書いてた)と、
for i in $* を分ける必要はなかったという話。
while read がどうしても必要なら、
 cat $@ | while read line ; do hoge;done| huga
とか、好きにかける。
そもそも、複雑なフィルターならシェルスクリプトで書くなって話もあるけど、、、。

コメントを残す