捕获 bash 输出并将其与一行文本进行比较

Capture bash output and compare it to a line of text

我刚加入 Whosebug,因为我需要一些帮助。我一直在对我们的 Red Hat 服务器做一些基本的管理,因为我们 运行 Nagios 在上面,但我被要求制作一些脚本来监控我们的 SAP 环境。

我修改了 SAP 服务器和 CCMS 插件以返回我们需要的输出:

EU_PUT 历史 = EU_PUT | 00101401 | Afgebroken |, 开始于 2016-10-20,00:10:18 终止于 2016-10-20,00:10:18

我想使用捕获的输出 (^) 并检查它是否包含单词 'Beënd'。如果是,则表示作业成功结束,如果不是,则表示作业失败(无论失败状态如何)。无论我做什么,脚本都不会接收输出。当 运行 执行以下脚本但比较不起作用时,输出成功显示。

我做错了什么?任何帮助将不胜感激!

亲切的问候, 丹尼斯·兰斯

   #!/bin/bash
    T1="*Beënd*"

    #For Nagios reporting purposes:
    unknown="0"
    ok="1"
    warning="2"
    critical="3"

    output=$(/usr/local/nagios/libexec/check_sap job_eu_put lnx '2>&1')

    if [[ "$output" == "$T1" ]]
        then
            echo $output
            exit $ok
        else
            echo $output
            exit $critical

    fi

从 2>&1 中删除 stderr 到 stdout 重定向引用

  output=$(blah 2>&1)
  echo $output
  No command 'blah' found, did you mean: Command 'blam' from package 'blam' (universe) blah: command not found

首先,您没有正确重定向标准错误。当您将重定向用引号括起来时,就像您使用 '2>&1' 一样,您实际上只是将一个字符串作为参数传递。例如:

$ echo foo '>/dev/null'
foo >/dev/null

修复重定向后,您可能还想确保 output 变量包含您认为应该包含的值。一个常见的错误来源是在其中一个字符串包含换行符或 leading/trailing 空格时进行字符串比较。

用引号括起重定向不是一个好习惯。但更重要的是,您的 if 语句 [[ "$output" == "$T1" ]] 进行了严格的比较,它不会询问 $T1 是否是 $output 的子字符串。您应该为此使用 [[ "$output" == *"$T1"* ]] 。也就是说,* 不应放在引号内,就像您在 T1 变量的定义中那样:

#!/bin/bash
T1="Beënd"

#For Nagios reporting purposes:
unknown="0"
ok="1"
warning="2"
critical="3"

output=$(/usr/local/nagios/libexec/check_sap job_eu_put lnx '2>&1')

if [[ "$output" == *"$T1"* ]]
    then
        echo $output
        exit $ok
    else
        echo $output
        exit $critical

fi