【发布时间】:2012-09-04 17:43:10
【问题描述】:
在 bash 的一行中,当/usr/local/bin/monit --version 的输出不完全包含5.5 时,我如何返回退出状态 0,而当它包含时,我如何返回退出状态 1?
【问题讨论】:
标签: bash
在 bash 的一行中,当/usr/local/bin/monit --version 的输出不完全包含5.5 时,我如何返回退出状态 0,而当它包含时,我如何返回退出状态 1?
【问题讨论】:
标签: bash
! /usr/local/bin/monit --version | grep -q 5.5
(grep 如果找到匹配项,则返回退出状态 0,否则返回 1。-q 选项“quiet”告诉它不要打印找到的任何匹配项;换句话说,它告诉grep 你唯一想要的就是它的返回值。开头的! 反转了整个管道的退出状态。)
编辑添加:或者,如果您想在“纯 Bash”中执行此操作(而不是调用 grep),您可以编写:
[[ $(/usr/local/bin/monit --version) != *5.5* ]]
([[...]] 在§3.2.4.2 "Conditional Constructs" of the Bash Reference Manual 中进行了解释。*5.5* 就像在 fileglob 中一样:零个或多个字符,加上 5.5,再加上零个或多个字符。)
【讨论】:
/usr/local/bin/monit --version 的值在失败时是否也有回显?
monit --version 值,同时仍以状态 1 退出?
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。
[ $(/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"
【讨论】:
[[ "5a5" =~ "5.5" ]] && echo yes 只打印 [[ "5a5" =~ 5.5 ]] && echo yes 打印是。引用的版本在 zsh 中有效,但在 bash 中无效。
测试grep的返回值:
sudo service xyz status | grep 'not' &> /dev/null
if [ $? == 0 ]; then
echo "whateveryouwant"
fi
我会推荐 cron,它适用于 SALT 堆栈
【讨论】: