3

我有以下脚本

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

4 回答 4

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' 循环的退出状态,如果在示例的开头找到 'foo:bar',它将为 1线。

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

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

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

于 2010-02-06T02:30:08.847 回答
1

您正在将文本从小写文本转换为大写文本,然后针对小写进行测试,因此您永远不会退出。

于 2010-02-06T02:45:35.483 回答
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
于 2010-02-06T02:47:27.483 回答
0

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

于 2010-02-06T02:45:18.657 回答