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

54

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 ça ne marche pas. Est-ce que quelqu'un sait la bonne façon de faire cela?

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

Réponses:

65

Utilisez la [[construction conditionnelle bash et préférez la convention de substitution de commande $(<command> ). De plus, [[empêche le fractionnement des mots des valeurs de variable, 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
iruvar
la source
30

Une autre alternative consiste simplement à tester le statut de sortie de greplui-même, ce qui renverra false (1) s'il n'y a pas de correspondance et true (0) s'il y en a une, en n'utilisant pas la [commande.

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

La redirection vers / dev / null a pour but d'empêcher l'impression de la ligne trouvée à l'écran.

Au hasard832
la source
12
Notez l' -qoption de grep au lieu de rediriger vers / dev / null. Avec -q, grep ne génère rien et arrête la recherche après le premier match.
Stéphane Chazelas
5

Encore plus simple,

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

Si vous voulez juste faire une chose.

Rob Bos
la source
4

Vous pouvez faire plus précis, mais simple, correspondant à awk.

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

Pour correspondre plus étroitement à la structure de votre commande, le moyen portable de faire une correspondance générique sur une chaîne dans un shell est d'utiliser la caseconstruction.

case "$(netstat -lnp | grep ':8080')" in
  *java*)  echo "Found a Tomcat!";;
esac
Gilles, arrête de faire le mal
la source
0

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
Frank Nocke
la source
Que fait HEAD-il? Est-ce une fonction personnalisée ou un alias sur votre système?
luckman212
usr/bin/HEAD → lwp-request. Et lwp-request semble être celui-ci . Pas sûr, comment je suis arrivé (pas manuellement manuellement), de si tout est là par défaut. Il semble y avoir un minuscule usr/bin/head aussi bien .
Frank Nocke