そのバックスラッシュは必要ありません-これはCシェルではありません。
問題は、whileループがサブシェル内にあり、それが終了することですが、サブシェルとして実行されるため、メインスクリプトは続行されます。
コンテキストでは、最も簡単な修正はおそらく次のとおりです。
while read line
do
line=`echo $line | tr "[:lower:]" "[:upper:]"`
if [ "`echo $line | cut -f1 -d:`" = "foo" ] &&
[ "`echo $line | cut -f2 -d:`" = "bar" ]; then
echo 'exist'
exit 1
fi
done < $1
複数のファイル(「cat$1」ではなく「cat"$@"」)を処理する必要がある場合は、さらに多くの作業を行う必要があります。
cat "$@" |
while read line
do
line=`echo $line | tr "[:lower:]" "[:upper:]"`
if [ "`echo $line | cut -f1 -d:`" = "foo" ] &&
[ "`echo $line | cut -f2 -d:`" = "bar" ]; then
echo 'exist'
exit 1
fi
done
[ $? != 0 ] && exit 1
これにより、「cat」と「while」で構成されるパイプラインの終了ステータスがチェックされます。これは、「while」ループの終了ステータスです。例では、「foo:bar」が先頭にある場合は1になります。ライン。
もちろん、それを検出する他の方法があります。
grep -s -q "^foo:bar:" "$@" && exit 1
これにより、ループバージョンよりもはるかに少ないコマンドが実行されます。('^ foo:bar $'も許可する必要がある場合は、プレーンgrepの代わりにegrepを使用してください。)