Bourne Shell退出将无法正常工作

时间:2010-02-06 02:22:31

标签: shell exit sh

我有以下脚本

cat $1 | 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 'exsist'
        exit 1;
    fi
done
一切都可以回应,然后当脚本退出时,它不会继续运行。任何想法。

由于

4 个答案:

答案 0 :(得分:5)

你不需要反斜杠 - 这不是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'循环的退出状态,如果在'while'中找到'foo:bar',则在示例中为1开始一行。

当然,还有其他方法可以检测到这种情况,例如:

grep -s -q "^foo:bar:" "$@" && exit 1

这比循环版本执行的命令要少得多。 (如果你还需要允许'^ foo:bar $',请使用egrep而不是plain grep。)

答案 1 :(得分:1)

您正在将文本从小写文本翻译为大写文本,但随后针对小写进行测试,因此您永远不会到达退出。

答案 2 :(得分:1)

因为你想为每一行转换为大写,你可以这样做

#!/bin/sh

tr '[:lower:]' '[:upper:]' < file | while IFS=":" read -r a b c
do
    case "$a $b" in
        "FOO BAR" ) echo "exist";exit;;
        *) echo "$a $b";;
    esac
done

或者你可以用awk(nawk for Solaris)

来实现
nawk -F":" '
topper($1)=="FOO" && topper($2)=="BAR"{
    print "exist"
    exit
}
{
    print topper($0)
}
' file

答案 3 :(得分:0)

通过在测试之上添加shopt -s nocasematch,可以使条件不区分大小写。要将事情设置为区分大小写:shopt -u nocasematch