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


76

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

Answers:


104
! /usr/local/bin/monit --version | grep -q 5.5

grep如果找到匹配项,则返回退出状态0,否则返回1。-q“ quiet”选项告诉它不打印找到的任何匹配项;换句话说,它告诉grep您唯一需要的是返回值-value。!开始时会反转整个管道的退出状态。)

编辑添加:或者,如果要在“纯Bash”中执行此操作(而不是调用grep),则可以编写:

[[ $(/usr/local/bin/monit --version) != *5.5* ]]

[[...]]在说明的的§3.2.4.2“条件结构”击参考手册*5.5*就像在fileglobs:零个或多个字符,再加上5.5,加零个或多个字符)。


才华横溢的天才!管道的力量一直令人印象深刻。
Joshua Pinter

是否还有任何东西可以回响/usr/local/bin/monit --version失败时的价值?
Joshua Pinter

@JoshuaPinter:请澄清-“什么时候失败”是什么意思?(哪个方向是“失败”?)
ruakh

@ruakh退出代码为1时,是否可以monit --version在退出状态为1的情况下显示该值?
Joshua Pinter

1
@JoshuaPinter:这似乎等同于monit --version; monit --version | grep -q 5.5;但是我猜你是要用grep -q光秃秃的代替grep吗?在这种情况下,您可以稍微简化为monit --version | grep -q 5.5 || (monit --version; false)。并且-monit --version是否打印多行?如果不是,则可以简化为! monit --version | grep -v 5.5
ruakh

27
[ $(/usr/local/bin/monit --version) == "5.5" ] 

eg-1:检查是否成功

[ $(/usr/local/bin/monit --version) == "5.5" ] && echo "OK"

eg-2:检查故障

    [ $(/usr/local/bin/monit --version) == "5.5" ] || echo "NOT OK"

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

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

“ 5.5”将是大量输出的一部分。
丹·奥康纳

@perreal-您不能在bash中引用正则表达式,它使它成为文字字符串而不是正则表达式。(在某些较早版本的bash中引用有效,但已作为错误修复)。
jordanm 2012年

@jordanm,那是不正确的。如果您不引用5.5,它将也匹配5a5。引号使点成为字符串。
Perreal

1
@perreal我刚刚测试了它。[[ "5a5" =~ "5.5" ]] && echo yes什么都不[[ "5a5" =~ 5.5 ]] && echo yes打印,但是打印是。引用的版本适用于zsh,但不适用于bash。
jordanm

2

测试grep的返回值:

sudo service xyz status | grep 'not' &> /dev/null
if [ $? == 0 ]; then
   echo "whateveryouwant"
fi

我会推荐cron,它可以与SALT堆栈一起正常工作

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.