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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top