linux - Bash oneliner with pipes 和 if condition giving error

标签 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

我得到的输出是

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/

相关文章:

java - shell命令前的$是什么

linux - 为什么 proc/ID/maps 有多个共享库条目

c - 在 Linux 中使用 pcap 获取接口(interface)的 IP 地址

linux - 如何启动键盘映射项目

c - Pthread 线程创建后立即运行

bash - 循环 bash 目录中具有特定名称的所有文件

Linux shell 脚本 : Allow user to use variables in input

linux - 在 bash 脚本中重用虚拟文件

bash - 从包含路径的变量中删除当前目录

bash - 是否可以通过读取和/或中断引号来执行 shell 注入(inject)?