【问题标题】:How do I test (in one line) if command output contains a certain string?如果命令输出包含某个字符串,我如何测试(在一行中)?
【发布时间】:2012-09-04 17:43:10
【问题描述】:

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

【问题讨论】:

    标签: bash


    【解决方案1】:
    ! /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 的值在失败时是否也有回显?
    • @JoshuaPinter:请澄清——“当它失败时”是什么意思? (哪个方向是“失败”?)
    • @ruakh 当退出码为 1 时,是否可以显示monit --version 值,同时仍以状态 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
    【解决方案2】:
    [ $(/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,这是不正确的。如果您不引用 5.5,它也将匹配 5a5。引号使点成为字符串。
    • @perreal 我刚刚测试过了。 [[ "5a5" =~ "5.5" ]] && echo yes 只打印 [[ "5a5" =~ 5.5 ]] && echo yes 打印是。引用的版本在 zsh 中有效,但在 bash 中无效。
    【解决方案3】:

    测试grep的返回值:

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

    我会推荐 cron,它适用于 SALT 堆栈

    【讨论】:

      猜你喜欢
      • 2018-11-16
      • 1970-01-01
      • 2021-09-10
      • 2014-02-24
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多