Вам не нужна обратная косая черта - это не оболочка 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 "$ @"' вместо 'cat $ 1'), тогда вам придется работать намного сложнее немного сложнее:
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, которое будет равно 1 в примере, если на foo найден 'foo: bar' начало строки.
Конечно, есть и другие способы обнаружить это, например:
grep -s -q "^foo:bar:" "$@" && exit 1
Это выполняет намного меньше команд, чем версия цикла. (Если вам также нужно разрешить '^ foo: bar $', используйте egrep вместо обычного grep.)