関数の中で、前処理、後処理(前処理の調整)を
したくないっていうのなら、こうなる。

foo() {
 hoge=0
 while IFS= read -r line; do
  [ なにか ] && hoge=1
  ほかにいろいろ
 done
 [ hoge = 0 ]
}

前処理
if cat | foo; then
 前処理の調整
else
 前処理の調整
fi


これはもうシェルスクリプトがどうとかいうんじゃなくて、
個人のプログラミング技術レベルの問題
まともな設計能力があればできること

ワンライナーとかシェル芸とかばっかりやってると
こういうプログラミング能力が身につかないのかもなw