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