开发者

Bourne Shell exit will not work

I have the following script

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

everything works up to echo and then when the script hits exit it does not and keeps going. Any ideas.

Thanks


You don't need that backslash - this is not the C shell.

The problem is that the while loop is in a sub-shell, which exits, but because it is run as a sub-shell, the main script continues.

In the context, the simplest fix is probably:

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

If you have to process multiple files ('cat "$@"' instead of 'cat $1'), then you have to work a lot harder bit harder:

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

This checks the exit status of the pipeline consisting of 'cat' and 'while', which is the exit status of the 'while' loop, which will be 1 in the example if 'foo:bar' is found at the start of a line.

Of course, there are other ways to detect that, such as:

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

This executes a lot less commands than the loop version. (If you need to allow for '^foo:bar$' as well, use egrep instead of plain grep.)


You're translating your text from lower case text to upper case text, but then testing against lower case, so you never get to the exit.


since you want to convert to upper case for every line, you can do it like this

#!/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

OR you can do it with just awk(nawk for Solaris)

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


You can make your conditionals case-insensitive by adding shopt -s nocasematch above the test. To set things back to case-sensitive: shopt -u nocasematch.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜