Bourne Shell salida no funcionará
Pregunta
Tengo el siguiente 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
todo funciona hasta eco y luego, cuando el guión golpea salir no lo es y no sigue adelante. Cualquier idea.
Gracias
Solución
No es necesario que la barra invertida -. Este no es el shell C
El problema es que el bucle mientras está en un sub-shell, que sale, pero debido a que se ejecuta como un sub-cáscara, el script principal continúa.
En el contexto, la solución más sencilla es probablemente:
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
Si usted tiene que procesar varios archivos ( 'gato "$ @"' en lugar de 'gato $ 1'), entonces usted tiene que trabajar un mucho más difícil poco más 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
Esto comprueba el estado de salida de la tubería que consiste en 'gato' y 'while', que es el estado de salida del bucle 'while', que será 1 en el ejemplo si 'foo: bar' se encuentra en el inicio de una línea.
Por supuesto, hay otras maneras de detectar que, por ejemplo:
grep -s -q "^foo:bar:" "$@" && exit 1
Esto ejecuta comandos mucho menos que la versión de bucle. (Si usted necesita para tener en cuenta. '^ Foo: bar $', así, utilizar egrep en lugar de grep normal)
Otros consejos
Usted está traduciendo el texto a partir de texto en minúsculas a mayúsculas el texto, pero luego las pruebas contra minúsculas, por lo que nunca llegar a la salida.
ya que desea convertir a mayúsculas para cada línea, puede hacerlo de esta manera
#!/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
O puedes hacerlo con sólo awk (nawk para Solaris)
nawk -F":" '
topper($1)=="FOO" && topper($2)=="BAR"{
print "exist"
exit
}
{
print topper($0)
}
' file
Usted puede hacer entre mayúsculas y minúsculas mediante la adición de shopt -s nocasematch
por encima de la prueba de sus condicionales. Para poner las cosas de nuevo a mayúsculas y minúsculas:. shopt -u nocasematch