web-dev-qa-db-fra.com

Comment faire une instruction if à partir du résultat d'une commande exécutée

J'essaie de faire une instruction IF à partir de la sortie d'une commande exécutée. Voici comment j'essaie de le faire, mais cela ne fonctionne pas. Quelqu'un connaît-il la bonne façon de procéder?

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

Utilisez le bash [[ construction conditionnelle et préférez le $( <commande> ) convention de substitution de commande. Aditionellement, [[ empêche Word de fractionner les valeurs des variables, il n'est donc pas nécessaire de citer le bit de substitution de commande.

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

Une autre alternative consiste à simplement tester l'état de sortie de grep lui-même, qui retournera false (1) s'il n'y a pas de correspondance et true (0) s'il y en a une, en n'utilisant pas le [ commande.

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

La redirection vers/dev/null est pour l'empêcher d'imprimer également la ligne trouvée à l'écran.

34
Random832

Encore plus simple,

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

Si vous voulez juste faire une chose.

6
Rob Bos

Vous pouvez faire une correspondance plus précise, mais simple, avec awk.

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

Pour correspondre plus étroitement à la structure de votre commande, la méthode portable pour effectuer une correspondance générique sur une chaîne dans un shell consiste à utiliser la construction case.

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

Un autre exemple du monde réel :)

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
0
Frank Nocke