如何根据已执行命令的结果执行if语句


54

我正在尝试从已执行命令的输出中执行IF语句。这是我尝试执行的操作,但是没有用。有人知道这样做的正确方法吗?

if [ "`netstat -lnp | grep ':8080'`" == *java* ]; then
  echo "Found a Tomcat!"
fi

Answers:


66

使用bash [[条件构造,并首选$(<command> )命令替换约定。另外,[[防止变量值的字分割,因此无需引用命令替换位。

if [[ $(netstat -lnp | grep ':8080') = *java* ]]; then
  echo "Found a Tomcat!"
fi

30

另一种选择是简单地测试grep自身的退出状态,如果不匹配,则返回false(1),如果不匹配则返回true(0)[

if netstat -lntp | grep ':8080.*java' > /dev/null; then
    echo "Found a Tomcat!"
fi

重定向到/ dev / null是为了防止它也将找到的行打印到屏幕上。


12
注意-qgrep 的选项,而不是重定向到/ dev / null。使用时-q,grep不输出任何内容,并且在第一个匹配项之后停止搜索。
斯特凡Chazelas

5

更简单的是

netstat -lntp | grep ':8080.*java' > /dev/null && command

如果您只想做一件事。


4

您可以使用awk进行更精确,更简单的匹配。

if netstat -lnp | awk '$4 ~ /:8080$/ && $7 ~ /java/ {exit(0)} END {exit(1)}'; then 

为了更紧密地匹配命令的结构,可对外壳中的字符串进行通配符匹配的可移植方法是使用case结构。

case "$(netstat -lnp | grep ':8080')" in
  *java*)  echo "Found a Tomcat!";;
esac

0

另一个真实的例子:)

if [[ $(HEAD mycompany-intranet.com | grep '200\ OK' | wc -l) = "1" ]];  then
    echo doing some intranet settings (proxy, etc)
else
    echo doing some work-at-home settings (proxy, etc)
fi

怎么HEAD办?这是系统上的自定义函数还是别名?
luckman212

usr/bin/HEAD → lwp-request。lwp-request似乎就是这个。不知道我是怎么来的(当然不是手动),默认情况下是否全部存在。似乎有一个小写字母usr/bin/head 以及
Frank Nocke
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.