Bourne Shell saída não funcionará
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
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