it-swarm.com.de

So führen Sie eine if-Anweisung aus dem Ergebnis eines ausgeführten Befehls aus

Ich versuche, eine IF-Anweisung aus der Ausgabe eines ausgeführten Befehls auszuführen. Hier ist, wie ich es versuche, aber es funktioniert nicht. Kennt jemand den richtigen Weg, um dies zu tun?

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

Verwenden Sie die Bash [[ bedingtes Konstrukt und bevorzuge das $( <Befehl> ) Befehlsersetzungskonvention. Zusätzlich, [[ verhindert die Word-Aufteilung von Variablenwerten, daher muss das Befehlsersetzungsbit nicht angegeben werden.

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

Eine andere Alternative besteht darin, einfach den Exit-Status von grep selbst zu testen, der false (1) zurückgibt, wenn keine Übereinstimmung vorliegt, und true (0), wenn eine vorhanden ist, indem der [ Nicht verwendet wird. Befehl.

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

Die Umleitung nach/dev/null soll verhindern, dass auch die gefundene Zeile auf dem Bildschirm gedruckt wird.

34
Random832

Noch einfacher,

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

Wenn Sie nur eine Sache tun wollen.

6
Rob Bos

Sie können präziser und dennoch einfacher mit awk übereinstimmen.

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

Um die Struktur Ihres Befehls besser abzustimmen, können Sie den Konstrukt case auf tragbare Weise als Platzhalter für eine Zeichenfolge in einer Shell verwenden.

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

Ein weiteres Beispiel aus der Praxis :)

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