当存在两个if条件时,如何停止while循环



专家

需要你的帮助才能达到我的要求。我刚开始学习bash脚本。

脚本:

#!/bin/bash
tick=5
tock=
while :
do
if [ -z "$tick" ]
then
echo "All Good"
else
echo "call for support"
fi
if [ -z "$tock" ]
then
echo "I am good"
else
echo "call for support now"
fi
sleep 10
done

摘要:在正常情况下,变量tick和tock将始终为空。所以,当我运行这个脚本时,它会回显"一切都好";以及";我很好"每10秒。在发布状态期间,变量将具有一个整数。当它发生时,else条件将被击中,并且它将回声";呼吁支持";以及";立即呼吁支持";。

我需要的是,当IF条件失败时,脚本应该只从两个IF条件中ECHO else(现在调用支持和调用支持)一次并中断循环。

如果我在第一个ELSE中中断,则不读取第二个If。请帮我实现这一点。

提前谢谢。

有很多方法可以解决这个问题。阅读bash条件语句
基本上,您只需要确保相互依存地检查这两个条件。你在用完全独立的语句来检查它们。

你可以将循环本身建立在一个组合条件上——

while [[ -z "$tick" && -z "$tock" ]]; do echo all good; sleep $someTime; done
echo call support

或者如果您想要更详细的日志记录,则将一个条件设置为另一个内部条件。。。

while :
do if [ -n "$tick" ]
then echo "Ticking..."
if [ -n "$tock" ]
then echo "BOOM! call for support now"
break
fi
fi
done

bash中的if语句非常灵活。如果你知道它们是整数,你甚至可以用数学方法来计算它们。

while : ; do 
if ((tick && tock)); 
then echo "call support!"; break; 
else date; sleep $delay;
fi
done

只需确保在最适合您需求的结构中对两者进行集体检查(根据您的需求,在不同步骤中有或没有日志输出)。

附录

如果您总是需要检查两者,如果其中一个有值,则退出,但如果两者都有值,也总是希望报告,请使用OR后跟and。

while : ; do 
if ((tick || tock));                   # is either true?
then printf "call support! "           # primary message
echo "tick='$tick' tock='$tock'"; # relevant info
if ((tick && tock));              # are BOTH true?
then echo "BOTH triggers - call support NOW!" # extra message
fi
break;  # exit the loop either way? then do here BELOW 2nd IF
else date; sleep $delay;
fi
done

如果你需要知道哪一个是额外的逻辑,在更仔细地检查命中之前,你仍然可以使用OR来获得更高的效率。

while : ; do 
if ((tick || tock));                               # is either true?
then echo "call support!"                          # primary message
if ((tick)); then echo "tick='$tick'"; fi     # relevant action block
if ((tock)); then echo "tock='$tock'"; fi     # relevant action block
if ((tick && tock));                          # are BOTH true?
then echo "BOTH triggers - call support NOW!" # extra actions
break;  # ONLY exit the loop if BOTH true? do INSIDE here    
fi
else date; sleep $delay;
fi
done

使用((tick||tock))意味着如果$tick为空,它将测试$tock,即每个循环检查2次,这还不错。一旦任何一个命中,根据需要,深入了解实际发生了什么。

最新更新