捕获 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
我刚加入 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