Bash でループを別プロセスにしない

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が入っている

( "<" の後の空白に注意してください)

プログラム的な処理が必要なときに 助かります。

Google サイト内検索

Amazonアソシエイト