你不需要那个反斜杠——这不是 C shell。
问题是while循环在一个子shell中,它退出了,但是因为它作为一个子shell运行,所以主脚本继续。
在上下文中,最简单的修复可能是:
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' 循环的退出状态,如果在示例的开头找到 'foo:bar',它将为 1线。
当然,还有其他方法可以检测到,例如:
grep -s -q "^foo:bar:" "$@" && exit 1
这比循环版本执行的命令少得多。(如果您还需要允许使用 '^foo:bar$',请使用 egrep 而不是普通的 grep。)