我正在尝试编写一个脚本来运行命令,如果命令的输出是 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
停止grep
grep 生成输出的选项。在这里,我们只关心是否grep
匹配3
,并通过其返回状态来检查。我们-x
强制匹配整条线(即我们只匹配3
而不匹配30
)。该-F
选项使grep
字符串匹配而不是正则表达式匹配。