Bash:如果/ Else语句在一行中

时间:2013-06-19 23:42:27

标签: bash

我正在尝试检查某个进程(假设它被称为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未运行,则不会回显任何内容。

5 个答案:

答案 0 :(得分:206)

无需明确核对$?。只是做:

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

请注意,这依赖于echo不会失败,这当然不能保证。更可靠的方法是:

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

答案 1 :(得分:51)

&&表示“如果成功”;通过在其右侧放置if语句,您可以确保仅在grep返回0时才会运行。要解决此问题,请改为使用;

  

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

(或者只是使用换行符。)

答案 2 :(得分:32)

使用grep -vc忽略grep输出中的ps并同时计算行数。

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

答案 3 :(得分:12)

您可以充分利用&&||运算符,如下所示:

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

答案 4 :(得分:1)

pgrep -q some_process && echo 1 || echo 0

更多oneliners here