初歩のシェルスクリプトで遊ぶ[ファイルのリネームツール、のようなもの?_(3)]

パイプを再帰で繋いでみるテスト

#!/bin/bash
: << '#----------------------------------------------------------------------------------comment'
■ ミニburdock --onceのみ
パイプの再帰つなぎテスト
#----------------------------------------------------------------------------------comment
pipeRecursiveOnceFunc(){

# 位置パラメータが1個以上あるならば、
if test "${#}" -ge 1 ; then

# 位置パラメータ${1}を変数に受け取って、ひとつshift
	CMD_1D="${1}"
	shift 1
else

# 位置パラメータが無いなら、標準入力をそのまま標準出力する
	cat -
	exit 0
fi

# 標準入力をreadで1行ずつ受け取る
while IFS= read -r LINE ; do

# 元位置パラメータを展開、evalでコマンドとみなして、
# 標準入力から来たデータをコマンドに入力、
# そのまま標準出力する
eval 'echo "${LINE}" | '"${CMD_1D}"


# whileループからの標準出力を、すべて、この関数自身に再帰入力
# 位置パラメータは、shiftで一個減らしたものを
# ふたたび位置パラメータに全て与える
done | pipeRecursiveOnceFunc "${@}"
}

pipeRecursiveOnceFunc "${@}"
#!/bin/bash
: << '#----------------------------------------------------------------------------------comment'
■ ミニburdock --loopのみ
パイプの再帰つなぎテスト
#----------------------------------------------------------------------------------comment
pipeRecursiveLoopFunc(){

if test "${#}" -ge 1 ; then
	CMD_1D="${1}"
	shift 1
else
	cat -
	exit 0
fi


eval 'while IFS= read -r LINE ; do

echo "${LINE}"

done | '"${CMD_1D}"' | pipeRecursiveLoopFunc "${@}"'
}

pipeRecursiveLoopFunc "${@}"


簡易型の『burdock』のテストで、標準入力された文字データを、引数に与えたコマンドでevalして加工していく。
昨日の「(2)」で書いた、パイプでつないで並列処理できねーかな、の実装例として、試しにやってみた。
位置パラメータが単純にコマンドの文字列だけだってんなら、こうやって簡単に書けるんだけど。他のオプションをどうやって処理するかだとか、パイプの先にシェル変数がどこまで受け継がれてくれるか、だとか。
そのへんの判断が、シェルの仕組みに詳しくない私だと、難しくてどうとも。
並列処理になって、いるような気はするんだけど、なんかちょっと、重い気がする。並列にはなっても結局は重いんだったら、実用性は無いんだし。


確かに昨日書いたような、コマンドの文字列を作ってeval、よりは、こっちのほうがなんとなく格好いいことをしてる、ように見えるんだけどもさ。再帰って、なんかおっかない。
勉強目的なら、このやり方でやってみるのは悪くないとは思うんだけども。重くても、難しくてトラブルまみれでも、いいなら。