Bash - if语句与mail命令结合使用

时间:2014-02-15 14:54:22

标签: linux bash email if-statement

我需要写一个内线来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语句为true或false时,它会在两种情况下都发送电子邮件。当我把“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

在这种情况下,如果给出true或false,也会发送电子邮件。我知道编程有点但我是bash的初学者。任何关于我做错的建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:4)

  

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

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

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

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


编辑:noted作为chepner,以美元符号($)开头的双引号字符串会导致字符串为translated according to the current locale。所以你可能想说:

subject="Host_down"

而不是说

subject=$"Host_down"

答案 1 :(得分:1)

你的问题在于:

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

应该是:

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

即使-n为空,echo也会阻止$i提出的换行符。因此,现在wc -l将正确返回0而不是1

您的“工作”版本,其中您说“if语句正常工作,并在服务器关闭时输出$i”可能工作:服务器启动,打印出一个空行。