我正在尝试使用 if 条件在 bash 中查找特定进程的编号
if ps auwx | grep -v grep | grep -ic python -le 2; then echo error; else echo no_error; fi
我得到的输出是
grep: python: No such file or directory
没有错误
如果我使用管道,一行代码似乎会中断,如果我省略管道也不会抛出错误,如果我使用绝对路径来 grep 也没有关系。没有管道我无法获得所需的结果.我在这里做错了什么?我可以在脚本文件中完成此操作,方法是将其分解为变量然后进行比较,但我将其用作学习 bash 的练习。非常感谢任何帮助。
最佳答案
首先,if
命令的语法是:
if cmd; then
# cmd exited with status 0 (success)
else
# cmd exited with status >0 (fail)
fi
上面的 cmd
就是所谓的 list - pipelines 序列。每个管道都是一系列用 |
分隔的命令。
-le
运算符仅由test
命令(也称为[
,或[[
), 而不是通过 if
命令。
所以,当你说:
if ps auwx | grep -v grep | grep -ic python -le 2; then ... fi
你实际上调用了带参数的grep
:
grep -ic python -le 2
并且由于 -e
用于指定搜索模式,因此参数 python
被解释为要搜索模式的文件的文件名 2
。这就是为什么 grep
告诉您它找不到名为 python
的文件。
要在 if
中测试命令管道的输出,您可以在 [[
/[
/ 中使用命令替换>测试
(正如其他答案所暗示的那样):
if [[ $(ps auwx | grep -v grep | grep -ic python) -le 2 ]]; then ... fi
或者,在 (( .. ))
中,使用隐式算术比较:
if (( $(ps auwx | grep -v grep | grep -ic python) <= 2 )); then ... fi
关于linux - Bash oneliner with pipes 和 if condition giving error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46758144/