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

54

Ich versuche, eine IF-Anweisung aus der Ausgabe eines ausgeführten Befehls zu erstellen. 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
Djangofan
quelle

Antworten:

65

Verwenden Sie das bash- [[bedingte Konstrukt und bevorzugen Sie die $(<command> )-Befehlssubstitutionskonvention. Zusätzlich [[verhindert somit von Variablenwerten Wort Spaltung besteht keine Notwendigkeit, den Befehl Substitution Bit zu zitieren ..

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

Eine andere Alternative besteht darin, einfach den Exit-Status von sich grepselbst zu testen, der bei fehlender Übereinstimmung false (1) und bei fehlender Übereinstimmung true (0) zurückgibt, indem der [Befehl nicht verwendet wird .

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

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

Random832
quelle
12
Beachten Sie die -qOption grep anstelle von / dev / null. Mit -qgibt grep nichts aus und bricht die Suche nach dem ersten Treffer ab.
Stéphane Chazelas
5

Noch einfacher,

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

Wenn Sie nur eine Sache machen wollen.

Rob Bos
quelle
4

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

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

Um die Struktur Ihres Befehls genauer abzugleichen, können Sie den Platzhalterabgleich für eine Zeichenfolge in einer Shell auf übliche Weise mit dem caseKonstrukt durchführen.

case "$(netstat -lnp | grep ':8080')" in
  *java*)  echo "Found a Tomcat!";;
esac
Gilles 'SO - hör auf böse zu sein'
quelle
0

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
Frank Nocke
quelle
Was macht HEADdas? Ist das eine benutzerdefinierte Funktion oder ein Alias ​​auf Ihrem System?
luckman212
usr/bin/HEAD → lwp-request. Und die LWP-Anfrage scheint diese zu sein . Ich bin mir nicht sicher, wie ich dazu gekommen bin (nicht manuell sicher), oder ob es standardmäßig alles gibt. Es scheint auch Kleinbuchstaben usr/bin/head zu geben .
Frank Nocke