专家
需要你的帮助才能达到我的要求。我刚开始学习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次,这还不错。一旦任何一个命中,根据需要,深入了解实际发生了什么。