编写脚本来检查命令的输出是否为“3”

编写脚本来检查命令的输出是否为“3”

我正在尝试编写一个脚本来运行命令,如果命令的输出是 3,那么脚本应该退出,如果不是 3,那么脚本应该发送一封电子邮件,让我知道计数不是 3。我写了这个下面的代码,但由于某种原因,每次运行它时,我都会收到电子邮件,说输出不是 3,尽管它是 3。

#!/bin/bash

Server_Count=""
   nslookup servers | grep -i "Address: 10" | wc -l > /dev/null
   if [ $? == 3 ]; then
       Server_Count="$?"
else
   echo "Server Count is not 3 .. Please check" | mail -s "Server count issue" [email protected]

fi

答案1

$?将是前一个命令的退出代码而不是前一个命令的结果。所以假设命令成功,$?将为 0。

您想要命令替换:

#!/bin/bash

server_count=$(nslookup servers | grep -i "Address: 10" | wc -l)
if [[ "$server_count" -ne 3 ]]; then
  echo "Server Count is not 3 .. Please check" | mail -s "Server count issue" [email protected]
fi

这将设置server_count为结果,wc -l因此无需在 if 语句中再次设置它。因此我否定了 if 检查(如果服务器计数才不是等于 3 发送电子邮件,否则不执行任何操作)。

这里还-ne使用了检查,这是整数比较的正确检查。

附带说明一下,您正在使用[ ... ]带有 bash 比较运算符的POSIX shell 测试==。这在许多系统上仍然有效,但请注意,在使用时[ ... ]您应该使用=,并且在使用时[[ ... ]]您可以使用===

答案2

正如 Jesse_b 所解释的,您的代码不起作用,因为您正在查看返回状态wc -l而不是从它返回的数据。

if nslookup servers | grep -c -iF "Address: 10" | ! grep -q -xF 3; then
    echo 'Server count is not 3... please check' | mail -s 'Server count issue' [email protected]
fi

这样就不必通过计算 的输出中与给定字符串匹配的行数来将内容保存到变量中nslookup,如果该计数不正好是三,它将发送一封电子邮件。

使用-c,grep将输出与给定模式匹配的行数。-q停止grepgrep 生成输出的选项。在这里,我们只关心是否grep匹配3,并通过其返回状态来检查。我们-x强制匹配整条线(即我们只匹配3而不匹配30)。该-F选项使grep字符串匹配而不是正则表达式匹配。

相关内容