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
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
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.
Encore plus simple,
netstat -lntp | grep ':8080.*Java' > /dev/null && command
Si vous voulez juste faire une chose.
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