2011-03-08 14 views
7

Ok Necesito encontrar el resultado que da un comando, notely "gbak: ERROR" y luego falla en él. No sé si lo estoy haciendo de la manera correcta, intenté hacer si fallara si el grep hiciera una salida a/dev/null pero tampoco pude hacerlo funcionar (probablemente solo una mala sintaxis). Estoy seguro de que este es simple, por favor avíseme.Script Bash - Instrucción If, cómo grep para luego falla en la salida especificada

La sentencia if tengo en este momento es:

if [ `sudo -u firebird $GBAK_COMMAND | grep "gbak: ERROR"` == *gbak: ERROR* ]; then 
    echo "$DATE Unsucessful $1.gdb Gbak. Incorrect user/password" >> /var/log/messages 
    echo "Failed" 
    exit 1 
else 
    echo "pass" 
fi 
+2

En lugar de backticks, que están en desuso, siempre debe usar $ (...) si lo necesita. Es mejor legible, es independiente de la fuente y puede anidarlo fácilmente 'a = $ (b $ (c $ (d)) $ (e))' –

+0

Relacionado: [Grep output of command y úselo en la instrucción "if" , bash] (http://stackoverflow.com/q/19838118/320399) y [grep en la declaración IF] (http://stackoverflow.com/q/3943854/320399) – blong

+0

También relacionado: [¿Cómo uso un archivo de comparación grep dentro de una instrucción bash if/else?] (http://stackoverflow.com/q/2480584/320399) – blong

Respuesta

10

No es necesario los corchetes 'prueba' de operador; acaba de comprobar el estado de salida de grep:

if sudo -u firebird $GBAK_COMMAND | grep -q "gbak: ERROR" 
then 
    echo "$DATE Unsuccessful $1.gdb Gbak. Incorrect user/password" >> /var/log/messages 
    echo "Failed" 
    exit 1 
else 
    echo "pass" 
fi 

La opción -q a grep suprime toda la salida (POSIX y GNU variantes) por lo que acaba de obtener el estado, que las pruebas if. Si grep encuentra el patrón, devuelve éxito, lo que significa que el comando firebird falló. El único problema residual es '¿firebird escribe su error en la salida estándar o en el error estándar?' Si necesita redirigir el error estándar, escriba:

if sudo -u firebird $GBAK_COMMAND 2>&1 | grep -q "gbak: ERROR" 
then 
    echo "$DATE Unsuccessful $1.gdb Gbak. Incorrect user/password" >> /var/log/messages 
    echo "Failed" 
    exit 1 
else 
    echo "pass" 
fi 
+2

Para GNU grep, es posible que desee '-q' en lugar de/además de' -s' (GNU '-s' solo suprime las quejas sobre archivos ilegibles y tales, líneas no coincidentes). –

+0

¡Gran trabajo, gracias! Lo he arreglado ahora sin problemas. Sí, muy interesante, si no tengo 2> y 1, pasará directamente sobre él como si hubiera sido aprobado. Necesito aprender acerca de este error estándar ya que no sé demasiado sobre él o lo que hace. – edumike

+0

@Jeremiah: sí, tienes razón; y no es solo GNU 'grep' sino también POSIX. Voy a modificar la respuesta, gracias. –