如何测试(在一行中)命令输出是否包含某个字符串?

Dan*_*nor 67 bash

在一行bash中,如果输出/usr/local/bin/monit --version不完全包含5.5,退出状态为1时,如何返回退出状态0 ?

rua*_*akh 96

! /usr/local/bin/monit --version | grep -q 5.5
Run Code Online (Sandbox Code Playgroud)

(grep如果找到匹配则返回退出状态0,否则返回1.-q选项"quiet"告诉它不打印它找到的任何匹配;换句话说,它告诉grep你唯一想要的是它的返回-value.!开头反转整个管道的退出状态.)

编辑添加:或者,如果你想在"纯Bash"(而不是调用grep)中这样做,你可以写:

[[ $(/usr/local/bin/monit --version) != *5.5* ]]
Run Code Online (Sandbox Code Playgroud)

(Bash参考手册的 §3.2.4.2"Conditional Constructs"中[[...]]有解释.就像在fileglobs中一样:零个或多个字符,加上零个或多个字符.)*5.5*5.5


per*_*eal 22

[ $(/usr/local/bin/monit --version) == "5.5" ] 
Run Code Online (Sandbox Code Playgroud)

eg-1:检查是否成功

[ $(/usr/local/bin/monit --version) == "5.5" ] && echo "OK"
Run Code Online (Sandbox Code Playgroud)

例如-2:检查失败

    [ $(/usr/local/bin/monit --version) == "5.5" ] || echo "NOT OK"
Run Code Online (Sandbox Code Playgroud)

或者,只检查输出是否包含5.5:

[[ $(/usr/local/bin/monit --version) =~ "5.5" ]] || echo "NOT OK"
Run Code Online (Sandbox Code Playgroud)


小智 7

测试grep的返回值:

sudo service xyz status | grep 'not' &> /dev/null
if [ $? == 0 ]; then
   echo "whateveryouwant"
fi
Run Code Online (Sandbox Code Playgroud)

我推荐 cron,它与 SALT 堆栈配合得很好