Pergunta

Eu tenho o seguinte 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

tudo funciona até eco e, em seguida, quando os hits de script sair não e que continua indo. Todas as ideias.

Graças

Foi útil?

Solução

Você não precisa que barra invertida - este não é o shell C

.

O problema é que o loop while está em uma sub-shell, que sai, mas porque ele é executado como um sub-shell, o script principal continua.

No contexto, a correção mais simples é provavelmente:

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

Se você tem que processar vários arquivos ( '$ @ "cat' em vez de 'gato $ 1'), então você tem que trabalhar um muito mais difícil pouco mais difícil:

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

Isto verifica o estado de saída da conduta que consiste em 'gato' e 'tempo', que é o estado de saída do loop 'while', que será uma, no exemplo, se 'foo: bar' é encontrado no início de uma linha.

É claro, existem outras maneiras de detectar que, como:

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

Este executa muito menos comandos do que a versão loop. (Se você precisa para permitir a '^ foo: bar $'., Bem como, o uso egrep em vez de grep simples)

Outras dicas

Você está traduzindo o texto de minúsculas de texto para texto em maiúsculas, mas, em seguida, testando contra minúsculas, para que você nunca chegar à saída.

desde que você deseja converter em maiúsculas para cada linha, você pode fazê-lo como este

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

ou você pode fazê-lo com apenas awk (nawk para Solaris)

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

Você pode fazer seu condicionais case-insensitive, adicionando shopt -s nocasematch acima do teste. Para definir as coisas de volta a maiúsculas e minúsculas:. shopt -u nocasematch

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top