Cómo hacer una declaración if del resultado de un comando ejecutado


54

Estoy tratando de hacer una declaración IF de la salida de un comando ejecutado. Así es como estoy tratando de hacerlo, pero no funciona. ¿Alguien sabe la forma correcta de hacer esto?

if [ "`netstat -lnp | grep ':8080'`" == *java* ]; then
  echo "Found a Tomcat!"
fi

Respuestas:


65

Utilice la [[construcción condicional bash y prefiera la convención de sustitución de comando $(<comando> ). Además, [[evita la división de palabras de valores variables, por lo tanto, no es necesario citar el bit de sustitución de comando.

if [[ $(netstat -lnp | grep ':8080') = *java* ]]; then
  echo "Found a Tomcat!"
fi

30

Otra alternativa es simplemente probar el estado de salida de grepsí mismo, que devolverá falso (1) si no hubo coincidencia y verdadero (0) si hubo uno, al no usar el [comando.

if netstat -lntp | grep ':8080.*java' > /dev/null; then
    echo "Found a Tomcat!"
fi

La redirección a / dev / null es para evitar que también imprima la línea encontrada en la pantalla.


12
Tenga en cuenta la -qopción de grep en lugar de redirigir a / dev / null. Con -q, grep no genera nada y deja de buscar después de la primera coincidencia.
Stéphane Chazelas

5

Aún más simple

netstat -lntp | grep ':8080.*java' > /dev/null && command

Si solo quieres hacer una cosa.


4

Puedes hacerlo más preciso, pero simple, haciendo coincidir con awk.

if netstat -lnp | awk '$4 ~ /:8080$/ && $7 ~ /java/ {exit(0)} END {exit(1)}'; then 

Para hacer coincidir la estructura de su comando más de cerca, la forma portátil de hacer coincidir comodines en una cadena en un shell es con la caseconstrucción.

case "$(netstat -lnp | grep ':8080')" in
  *java*)  echo "Found a Tomcat!";;
esac

0

Otro ejemplo del mundo real :)

if [[ $(HEAD mycompany-intranet.com | grep '200\ OK' | wc -l) = "1" ]];  then
    echo doing some intranet settings (proxy, etc)
else
    echo doing some work-at-home settings (proxy, etc)
fi

¿Qué HEADhacer? ¿Es esa una función personalizada o un alias en su sistema?
luckman212

usr/bin/HEAD → lwp-request. Y lwp-request parece ser este . No estoy seguro, cómo llegué a él (no de forma manual con seguridad), si todo está allí por defecto. Parece que hay una minúscula usr/bin/head así .
Frank Nocke
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.