Bash: If / Else в одному рядку


204

Я намагаюся перевірити, чи працює якийсь процес (припустимо, він називається some_process) на сервері. Якщо це так, то відлуння 1, інакше відлуння 0.

Це команда, яку я використовую, але вона працює лише частково (детальніше нижче). Зауважте, що мені потрібно написати сценарій одним рядком.

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

Примітка . [s]In some_proces[s]- це запобігання grepповерненню.

Якщо some_processпрацює, то "1"лунає, що добре. Однак якщо some_processне працює, нічого не відлунюється.


4
Можна використовувати ps -Ccmdдля пошуку процесів, назва команди яких "cmd", які можуть повністю усунути grep. psвстановить код виходу на деяке ненульове значення, якщо він не зможе знайти процес узгодження.
rici

Відповіді:


273

Не потрібно чітко перевіряти $?. Просто зробіть:

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

9
Якщо echo 1не вдасться, то echo 0буде виконано. У цьому випадку ехо-1 ніколи не вийде, але зауважте, що A&& B || C - це не тоді, а потім. C може запускатися, коли A відповідає дійсності. (З оболонки ).
схеми

@schemacs має дуже вагомий момент: редагування для надання набагато кращої альтернативи.
Вільям Перселл

2
Чи потрібно перенаправляти вихід команди ps на файл? Це б не спрацювало? if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi. Місцево, здається, це працює для мене. Це тому, що ОП мав перенаправлення в команді, яку він намагався?

1
Немає необхідності перенаправляти вихід. Я просто мав первинну позицію, оскільки я припускаю, що вихід зберігається з причини. Часто подібні речі просто придушуються (з grep -qабо перенаправляються на / dev / null).
Вільям Перселл

Я б користувався pgrep.
pawciobiel

67

&&означає "і в разі успіху"; розмістивши свою ifзаяву праворуч від неї, ви гарантуєте, що вона буде запущена лише у разі grepповернення 0. Щоб виправити це, використовуйте ;натомість:

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

(або просто використовувати перерву рядків).


6
+1 Це набагато краща відповідь, оскільки вона насправді відповідає на питання, а не просто в наданні альтернативи.
Вільям Перселл

41

Використовуйте grep -vcдля ігнорування grepу psвисновку та підрахунку рядків одночасно.

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

15

Ви можете в повній мірі використовувати &&і ||оператор , як це:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.