2014-03-25 52 views
0

我有一个bash脚本,用于检查外部温度计的温度,如果低于定义的数量时发送警报。然而它所做的是在10秒后不断发出警报(这是它最初的设计)。我想要做的是,如果它下降到22度以下,则发出一次警报,如果它超过22度,则发送另一次警报,但是只发生一次,等等。只警告一次的Bash脚本

#!/bin/bash 

while true; do 
    val=$(cat /sys/bus/) 
    min=$(echo "22.0") 
    if [[ "$val" < "$min" ]] 
    then 
     sendmail "too cold" 
     sleep 10 

    else 
     echo "All ok" 
     sleep 10 
    fi 
done 
exit 0 
+0

你可以做一些临时变量存储'val'和检查适用于像'如果follwing条件[ [“$ prev”-ne“$ val”]];然后prev = $ val if [[“$ val”<“$ min”]];然后.....' –

+0

'min = 22.0'就足够了;你不需要捕获'echo'的输出。 – chepner

回答

2

首先我从你放置的地方拿出sleep 10,并把它放在de外部。问题出现是因为您正在无限循环中执行脚本,这意味着它将被执行一次又一次。

你总是可以在指定的目录中创建一个使用触摸一个文件,并检查它是否存在:

#!/bin/bash 

while true; do 
    val=$(cat /sys/bus/) #removed a ' typo 
    min=$(echo "22.0") 

    if [[ "$val" < "$min" ]]; then 
    if [ ! -f "/var/testdir/message1_sent" ]; then 
     sendmail "too cold" 
     touch /var/testdir/message1_sent 

     if [ -f "/var/testdir/message2_sent" ]; then 
     rm /var/testdir/message2_sent 
     fi 
    fi 

    else 

    if [ ! -f "/var/testdir/message2_sent" ]; then 
     echo "All ok" 
     touch /var/testdir/message2_sent 

     if [ -f "/var/testdir/message1_sent" ]; then 
     rm /var/testdir/message1_sent 
     fi 

    fi 

    fi 

    sleep 10 

done 
#exit 0 #This is not reached, you are always inside a loop 
+0

感谢您的帮助,它看起来不错,但我尝试用sendemail替换echo“All ok”“恰到好处”,但我每10秒得到两次 – Lurch

+1

好吧,我会检查它并让您现在关闭^ __^ – ederollora

+0

你必须输入错误的东西。我复制粘贴的代码,并改变val从键盘读取,它的工作原理 – ederollora

0

我想它会再次发送邮件,因为温度不超过22.0度(可能需要一段时间才能超过22.0度?)。您可以添加发送电子邮件时发送的标志,并且只有在未设置标志的情况下才在最小分支中输入val <。当温度再次超过22.0度时,标志应该清除,然后所有的东西都应该重新工作。

0

您总是可以使用一个额外的变量来表示您已经发送通知太冷(< 22),另一个用于确定(> 22)。这些最初是错误的,当您首次发送“< 22”通知时,您将< 22的变量翻转为true,而将> 22的变量翻转为false,并且当然如果变量为false,则修改脚本以仅发送通知。当您发送“所有好”通知时,您再次将< 22的变量翻转为false,并将> 22的变量翻转为true,这应该这样做。