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

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

Random832
fonte
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.

Rob Bos
fonte
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
Gilles 'SO- parar de ser mau'
fonte
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
Frank Nocke
fonte
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