Bash: Если оператор /Else в одной строке

Я пытаюсь проверить, работает ли процесс (предположим, что он называется some_process) на сервере. Если это так, то echo 1, иначе echo 0.

Это команда, которую я использую, но она работает только частично (подробнее см. ниже). Обратите внимание, что мне нужно написать script в одной строке.

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

Примечание. [s] в some_proces[s] состоит в том, чтобы предотвратить возврат grep.

Если some_process работает, то "1" получает эхо, что хорошо. Однако, если some_process не работает, ничего не получает эхо.

Ответ 1

Нет необходимости явно проверять $?. Просто выполните:

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

Обратите внимание, что это зависит от эха, которое не сработает, что, безусловно, не гарантируется. Более надежный способ написать это:

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

Ответ 2

&& означает "и в случае успеха"; разместив оператор if с правой стороны, вы убедитесь, что он будет работать, только если grep возвращает 0. Чтобы исправить это, используйте ; вместо этого:

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

(или просто используйте разрыв строки).

Ответ 3

Используйте grep -vc для игнорирования grep в выводе ps и подсчета строк одновременно.

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

Ответ 4

Вы можете в полной мере использовать операторы && и || следующим образом:

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

Для исключения самой grep вы также можете сделать что-то вроде:

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