Bash で以下のようなループ処理を書くと パイプ以降が別プロセスになってしまうため その中で設定した変数を、ループ処理の外で参照することができません。
cat test1.txt | while read val1 val2
do
val3=$val1
done
echo $val3 # ←最後のval1は入っていない
単純にテキストから読み込む場合 次のように書くと 別プロセスを作らずに済むため ループの中で設定した変数を ループの外で参照することができます。
while read val1 val2 do val3=$val1 done < test1.txt echo $val3 # ←最後のval1が入っている
コマンドの実行結果をループに 渡している場合も・・・
cat test1.txt | grep -v "^a" | while read val1 val2 do val3=$val1 done echo $val3 # ←最後のval1は入っていない
次ような書き方をすることができます。
while read val1 val2 do val3=$val1 done < <(cat test1.txt | grep -v "^a") echo $val3 # ←最後のval1が入っている
( "<" の後の空白に注意してください)
プログラム的な処理が必要なときに 助かります。