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

时间:2016-10-20 11:45:37

标签: bash comparison output sap nagios

我刚刚加入Stackoverflow,因为我需要一些帮助。我一直在对我们的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

3 个答案:

答案 0 :(得分:1)

对于初学者,您没有正确地重定向标准错误。如果将重定向括在引号中,就像使用'2>&1'一样,实际上只是将字符串作为参数传递。例如:

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

修复重定向后,您可能还需要确保输出变量包含您认为应该的值。一个常见的错误来源是当其中一个字符串包含换行符或前导/尾随空格时进行字符串比较。

答案 1 :(得分:0)

从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 :(得分:0)

在引号中包含重定向不是一个好习惯。更重要的是,你的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