it-swarm.com.de

Bash: If / Else-Anweisung in einer Zeile

Ich versuche zu überprüfen, ob ein Prozess (angenommen, er heißt some_process) auf einem Server ausgeführt wird. Wenn ja, dann Echo 1, sonst Echo 0.

Dies ist der Befehl, den ich verwende, aber er funktioniert nur teilweise (weitere Informationen unten). Beachten Sie, dass ich das Skript in einer Zeile schreiben muss.

ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi

Hinweis: Der [s] in some_proces[s] soll verhindern, dass grep sich selbst zurückgibt.

Wenn some_process ausgeführt wird, wird "1" wiederholt, was in Ordnung ist. Wenn jedoch some_process nicht ausgeführt wird, wird nichts zurückgemeldet.

161
Arthur Rimbun

Es ist nicht erforderlich, $? explizit zu überprüfen. Mach einfach:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0 

Beachten Sie, dass dies darauf beruht, dass das Echo nicht ausfällt, was sicherlich nicht garantiert ist. Ein zuverlässigerer Weg, dies zu schreiben, ist:

if ps aux | grep some_proces[s] > /tmp/test.txt; then echo 1; else echo 0; fi
225
William Pursell

&& bedeutet "und wenn erfolgreich"; Indem Sie Ihre if -Anweisung rechts davon platzieren, stellen Sie sicher, dass sie nur ausgeführt wird, wenn grep0 zurückgibt. Verwenden Sie stattdessen ;, um das Problem zu beheben:

ps aux | grep some_proces[s] > /tmp/test.txt ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi

(oder verwenden Sie einfach einen Zeilenumbruch).

55
ruakh

Verwenden Sie grep -vc, um grep in der ps Ausgabe zu ignorieren und die Zeilen gleichzeitig zu zählen.

if [[ $(ps aux | grep process | grep -vc grep)  > 0 ]] ; then echo 1; else echo 0 ; fi
34
John Gilmer

Sie können die Operatoren && und || wie folgt vollständig nutzen:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0

Zum Ausschließen von grep selbst können Sie auch Folgendes tun:

ps aux | grep some_proces | grep -vw grep > /tmp/test.txt && echo 1 || echo 0
13
Costi Ciudatu