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]some_proces[s]是防止grep从返回本身。

如果some_process正在运行,则"1"得到回显,这很好。但是,如果some_process未运行,则不会响应。


4
您可以使用ps -Ccmd查找命令名称为“ cmd”的进程,该进程可以完全消除grepps如果找不到匹配的进程,则会将退出代码设置为某个非零值。
rici

Answers:


272

无需显式检查$?。做就是了:

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不是if-then-else。当A为true时,C可以运行。(来自shellcheck)。
schemacs 2014年

@schemacs提出了一个非常有效的观点:编辑以提供更好的替代方法。
威廉·珀塞尔

2
是否有必要将ps命令的输出重定向到文件?这行不通吗?if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi。在本地似乎对我有用。是否因为OP在他尝试的命令中进行了重定向?

1
绝对没有必要重定向输出。我只是模仿原始位置,因为我认为输出是出于某种原因被保存的。通常,这种事情只是被抑制(使用grep -q/ dev / null或重定向到/ dev / null)。
William Pursell 2014年

我会用pgrep
pawciobiel '16

67

&&表示“并且如果成功”;通过将if语句放在语句的右侧,可以确保语句仅在grepreturn时运行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忽视grepps输出,同时计数线。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.