Como fazer uma instrução if do resultado de um comando executado


54

Estou tentando fazer uma declaração se da saída de um comando executado. Aqui está como eu estou tentando fazer isso, mas não funciona. Alguém sabe o caminho certo para fazer isso?

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

Respostas:


65

Use a [[construção condicional do bash e prefira a convenção de substituição de comando $(<comando> ). Além disso, [[evita a divisão de palavras de valores variáveis, portanto, não há necessidade de citar o bit de substituição de comando.

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

30

Outra alternativa é simplesmente testar o status de saída grep, que retornará false (1) se não houver correspondência e true (0) se houver, não utilizando o [comando

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

O redirecionamento para / dev / null é para impedir que ele também imprima a linha encontrada na tela.


12
Observe a -qopção grep em vez de redirecionar para / dev / null. Com -q, grep não gera nada e para de procurar após a primeira correspondência.
Stéphane Chazelas 24/10/12

5

Ainda mais simples,

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

Se você apenas quer fazer uma coisa.


4

Você pode fazer uma correspondência mais precisa, porém simples, com o awk.

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

Para combinar a estrutura do seu comando mais de perto, a maneira portátil de fazer a correspondência curinga em uma sequência de caracteres em um shell é com a caseconstrução.

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

0

Outro exemplo do 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

O que HEADfaz? Isso é uma função personalizada ou um alias no seu sistema?
luckman212

usr/bin/HEAD → lwp-request. E lwp-request parece ser este . Não tenho certeza, como cheguei a ele (não manualmente, com certeza), ou se está tudo lá por padrão. Parece haver uma minúscula usr/bin/head também .
Frank Nocke 14/04
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.