我有以下脚本

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

一切正常了呼应,然后当脚本击中退出它不与不断去。任何想法。

由于

有帮助吗?

解决方案

您不需要反斜杠 - 这是不是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

如果你要处理多个文件( '猫 “$ @”',而不是 '猫$ 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
“:巴富”在被发现

如果这检查流水线,即“猫”和“同时”的,这是“而”循环的退出状态,这将在实施例是1中的退出状态开始一个线的

当然,还有其他方法来检测,如:

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

此执行比环形版本少了很多的命令。 (如果你需要允许。“^富:酒吧$”为好,使用egrep的,而不是普通的grep)

其他提示

您是从较低的情况下,文本翻译文本为大写文字,但随后对小写测试,所以你永远不会到达出口。

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

#!/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用于Solaris)做

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

您可以让你的条件语句不区分大小写,加入上述试验shopt -s nocasematch。要设置的东西返回到区分大小写:shopt -u nocasematch

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top