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

Art*_*bun 176 bash

我试图检查一个进程(假设它被调用some_process)是否正在服务器上运行.如果是,则回显1,否则回显0.

这是我正在使用的命令,但它只能部分工作(下面有更多信息).请注意,我需要在一行中编写脚本.

ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi
Run Code Online (Sandbox Code Playgroud)

注:[s]some_proces[s]是防止grep从返回本身.

如果some_process正在运行,那么"1"得到回应,这很好.但是,如果some_process没有运行,则不会回显任何内容.

Wil*_*ell 239

没有必要明确检查$?.做就是了:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0 
Run Code Online (Sandbox Code Playgroud)

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

if ps aux | grep some_proces[s] > /tmp/test.txt; then echo 1; else echo 0; fi
Run Code Online (Sandbox Code Playgroud)

  • 如果`echo 1`失败,那么将执行`echo 0`.在这种情况下,echo 1永远不会失败,但请注意A && B || C不是if-then-else.当A为真时,C可以运行.(来自[shellcheck](https://github.com/koalaman/shellcheck)). (6认同)
  • 是否有必要将ps命令的输出重定向到文件?这不行吗?`if ps aux | grep some_proces [s]; 然后回声1; 否则回声0; fi`.在当地它似乎适合我.是因为OP在他试过的命令中有重定向吗? (2认同)

rua*_*akh 64

&&意思是"如果成功"; 通过将您的if声明放在它的右侧,您确保它只会在grep返回时运行0.要修复它,请;改用:

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

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

  • +1这是一个更好的答案,因为它实际上回答了问题,而不仅仅是提供替代方案. (6认同)

小智 38

使用grep -vc忽视grepps输出,同时计数线.

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


Cos*_*atu 14

你可以充分利用这样的&&||运算符:

ps aux | grep some_proces[s] > /tmp/test.txt && echo 1 || echo 0
Run Code Online (Sandbox Code Playgroud)

要排除grep本身,您还可以执行以下操作:

ps aux | grep some_proces | grep -vw grep > /tmp/test.txt && echo 1 || echo 0
Run Code Online (Sandbox Code Playgroud)


onc*_*nce 11

pgrep -q some_process && echo 1 || echo 0
Run Code Online (Sandbox Code Playgroud)

更多单线在这里