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
djangofan
fuente

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
iruvar
fuente
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.

Aleatorio832
fuente
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.

Rob Bos
fuente
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
Gilles 'SO- deja de ser malvado'
fuente
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
Frank Nocke
fuente
¿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