bashでこんなプログラムを書きました
fruits.txt
apple
banana
orange
# !/bin/bash
cat fruits.txt | while read LINE do
echo ${LINE}
if [ $? -ne 0 ] ; then
echo "エラー:${LINE}"
exit 1;
fi
done
echo "正常終了!"
done
解説
fruit.txtの中身をcatしてwhile文にパイプで渡して標準出力するプログラムです。
実行してみる
例えばbananaのechoで失敗した場合、期待される出力は下記となります。
apple
エラー:banana
しかし実際の出力は下記となります。
エラー後にスクリプトが終了せず、後続の処理が続いていますね。
apple
エラー:banana
orange
正常終了!
原因
パイプでwhile文に渡す場合、whileループは元スクリプトの子プロセスとして
実行されてしまいます。
したがって、exit 1をしたとしてもあくまでも子プロセスしか終了せず、
メインの処理は続いてしまいます。
解決策1_子プロセスの戻り値を拾う
子プロセスの戻り値1を親プロセス側で拾って親プロセスを異常終了させます。
cat fruits.txt | while read LINE do
echo ${LINE}
if [ $? -ne 0 ] ; then
echo "エラー:${LINE}"
exit 1;
fi
done
if [ $? -ne 0 ] ; then
exit 1;
fi
解決策2_for文を使う
for文のリストにcatの結果を指定すれば解決します。
こうすると別途catの結果を入れる変数を定義する必要もないのでスマートかと。
for FRUIT in `cat fruits.txt`; do
echo ${FRUIT}
done