fil*_*ble 5 linux bash shell if-statement pipe
我正在尝试使用 if 条件在 bash 中查找特定进程的数量
if ps auwx | grep -v grep | grep -ic python -le 2; then echo error; else echo no_error; fi
Run Code Online (Sandbox Code Playgroud)
我得到的输出为
grep: python: No such file or directory
Run Code Online (Sandbox Code Playgroud)
没有错误
如果我使用管道,单行似乎会中断,如果我省略管道,则不会抛出任何错误,如果我使用绝对路径来 grep 也没有关系。没有管道,我无法获得所需的结果。我在这里做错了什么?我可以在脚本文件中完成此操作,方法是将其分解为变量然后进行比较,但我将其用作学习 bash 的练习。任何帮助是极大的赞赏。
首先,if
命令的语法是:
if cmd; then
# cmd exited with status 0 (success)
else
# cmd exited with status >0 (fail)
fi
Run Code Online (Sandbox Code Playgroud)
在cmd
上面的是所谓的名单-序列管道。每个管道都是一个以|
.分隔的命令序列。
的-le
操作者被解释仅通过test
命令(也称为[
,或[[
),而不是由if
命令。
所以,当你说:
if ps auwx | grep -v grep | grep -ic python -le 2; then ... fi
Run Code Online (Sandbox Code Playgroud)
你实际上grep
用参数调用:
grep -ic python -le 2
Run Code Online (Sandbox Code Playgroud)
并且由于-e
用于指定搜索模式,因此参数python
被解释为文件的文件名以搜索模式2
。这就是为什么grep
告诉你它找不到名为python
.
要测试一个命令管道的输出if
,你可以使用命令替换里面的[[
/ [
/ test
(如其他答案建议):
if [[ $(ps auwx | grep -v grep | grep -ic python) -le 2 ]]; then ... fi
Run Code Online (Sandbox Code Playgroud)
或者,在 内(( .. ))
,使用隐式算术比较:
if (( $(ps auwx | grep -v grep | grep -ic python) <= 2 )); then ... fi
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5404 次 |
最近记录: |