Bash:一行中的If/Else语句

我试图检查一个进程(假设它被称为some_process)是否在服务器上运行。如果是,则返回1,否则返回0。

这是我正在使用的命令,但它只起部分作用(更多信息如下)。注意,我需要在一行中编写脚本。

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

注意: some_proces[s]中的[s]用于防止grep返回自身。

如果some_process正在运行,那么"1"将被回显,这很好。然而,如果some_process未运行,则不会返回任何内容。

588989 次浏览

&&表示“and if successful”;通过将你的if语句放在它的右边,你可以确保它只在grep返回0时才会运行。要修复它,请使用;:

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

(或者直接使用换行符)。

不需要显式检查$?。只做:

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

你可以像这样充分利用&&||操作符:

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

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

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

更多的联机程序在这里