Bash - if 语句与邮件命令相结合



我需要写一个 1 行,它会 ping 服务器并在没有响应时发送电子邮件。到目前为止我写了这个

subject=$"Host_down" ;
i=$(ping -c1 -w3 100.100.100.100 | grep 100%) ;
j=$(echo $i | wc -l) ;
if [ $j -eq 1 ] ; then mail -s $subject admin@example.com < file.txt ; fi

但它在这两种情况下都会发送电子邮件,当 if 语句为真或假时。当我输入"echo $i"而不是"mail..."诸如此类

subject=$"Host_down" ;
i=$(ping -c1 -w3 100.100.100.100 | grep 100%) ;
j=$(echo $i | wc -l) ;
if [ $j -eq 1 ] ; then echo $i ; fi

然后 if 语句工作正常,仅在服务器关闭时输出$i。

我也试过这个

subject=$"Host_down" ;
i=$(ping -c1 -w3 100.100.100.100 | grep 100%) ;
j=$(echo $i | wc -l) ;
if [ $j -eq 1 ] ; then echo $i | mail -s $subject admin@example.com ; fi

在这种情况下,当 if 给出真或假时,也会发送电子邮件。我懂一点编程,但我是 bash 的初学者。任何关于我做错了什么的建议将不胜感激。

我需要编写一个 1 行,它将 ping 服务器并发送一个 没有回复时发送电子邮件。

你似乎有复杂的事情。 只需检查ping状态:

subject="Host_down";
if ! ping -c1 -w3 100.100.100.100; then
  mail -s $subject admin@example.com < file.txt;
fi

如果ping返回非零退出代码,则将执行 mail 命令。


编辑:正如Chepner所指出的,一个双引号的字符串前面有一个美元符号($)将导致字符串根据当前的语言环境进行翻译。 所以你可能想说:

subject="Host_down"

而不是说

subject=$"Host_down"

您的问题在于:

j=$(echo $i | wc -l) ;

其内容应为:

j=$(echo -n $i | wc -l) ;

-n将禁止显示echo放置的换行符,即使$i为空也是如此。所以现在wc -l将正确返回0而不是1.

您的"工作"版本,即您说"if语句工作正常,仅在服务器关闭时输出$i"可能不起作用:当服务器启动时,会打印一个空行。

最新更新