bashでパイプを使って以下のような処理をすると、ループ内の変数の値をループ外で参照できないようです。
#!/bin/bash
HOGE="hoge"
echo -e "$HOGE" | while read I ; do
HOGE="$HOGE $I"
echo "$HOGE"
done
echo "$HOGE"
上記を実行すると結果は以下のようになります。
hoge hoge hoge
原因はパイプを使うと、パイプの先は別プロセスで処理されるためのようです。つまり上記では、呼び出し元の$HOGEに入っている"hoge"は呼び出し先で参照でき、結果は"hoge hoge"になりますが、ループの外、つまり呼び出し元では呼び出し先の処理が反映されないので、"hoge"になります。
なので、対策は面倒ですが一度ファイルに書き出すのがベストな気がします。
#!/bin/bash
HOGE="hoge"
echo -e "$HOGE" | while read I ; do
HOGE="$HOGE $I"
echo "$HOGE" > tmp
done
HOGE=`cat tmp`