Выход из Bourne Shell не будет работать - PullRequest
3 голосов
/ 06 февраля 2010

У меня есть следующий скрипт

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 ]

5 голосов
/ 06 февраля 2010

Вам не нужна обратная косая черта - это не оболочка 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

Если вам нужно обрабатывать несколько файлов ('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, которое будет равно 1 в примере, если на foo найден 'foo: bar' начало строки.

Конечно, есть и другие способы обнаружить это, например:

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

Это выполняет намного меньше команд, чем версия цикла. (Если вам также нужно разрешить '^ foo: bar $', используйте egrep вместо обычного grep.)

1 голос
/ 06 февраля 2010

, так как вы хотите преобразовать в верхний регистр для каждой строки, вы можете сделать это следующим образом

#!/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
1 голос
/ 06 февраля 2010

Вы переводите свой текст из текста в нижнем регистре в текст в верхнем регистре, но затем проверяете его в нижнем регистре, поэтому вы никогда не доберетесь до выхода.

0 голосов
/ 06 февраля 2010

Вы можете сделать ваши условия нечувствительными к регистру, добавив shopt -s nocasematch над тестом. Чтобы вернуть значения с учетом регистра: shopt -u nocasematch.

...