如何在无限循环中执行一次命令

问题描述 投票:-3回答:3

有一个代码的想法:

while true; do
*check variable*
if [ variable == true ]; then
*command1 to execute*
.
.
.
*commandN to execute*
fi
done

如何在不离开此循环的情况下执行一次command1?显然,每当变量为true时,command1应该只执行一次?

编辑:我不想离开循环,因为它是无头debian家庭服务器/存储设备的监视脚本的一部分。检查变量是否检查VPN连接是否已打开。或者,如果文件夹中有新文件。或者如果有新用户登录。触发器可能是无数的。 Command1发送有关它的电子邮件通知。或者在自定义日志文件中写一个新行。再次,无数的应用程序。我不希望每次迭代都邮寄。一旦状态改变,它就是无关紧要的检查状态和执行命令。

linux bash infinite-loop
3个回答
0
投票

如果您只希望它执行一次,请将变量保留在循环之外 -


0
投票

有一个更贴近现实生活的例子:我想继续监听音频输出。如果音频接收器没有设置为HDMI,我希望每隔10秒看到无休止的屏幕提醒,但只有在发生时才会邮寄一次。

所以:

while true
do
if ! pacmd -list-sinks | grep -q "active port: <hdmi-output-0>"; then AUDIO_HDMI="false"; fi

if [ "$AUDIO_HDMI" == "false" ]; then
 MSG="Audio sink is not set to HDMI!"
 notify-send $MSG
 echo "$MSG" | mail -s "WARNING" [email protected] # <-PART OF CODE TO BE EXECUTED ONCE
fi

sleep 10
done

任何想法如何只发送一次该电子邮件?

也许有另一种方法来找到解决方案而不是无限循环?


0
投票

我终于成功地使用了另一个变量。

while true
do
if ! pacmd -list-sinks | grep -q "active port: <hdmi-output-0>"; then AUDIO_HDMI="false"; else SEND_MAIL="reset"; fi

if [ "$AUDIO_HDMI" == "false" ]; then
 MSG="Audio sink is not set to HDMI!"
 notify-send $MSG
 if [ "$SEND_MAIL" != "sent" ]; then echo "$MSG" | mail -s "WARNING" [email protected] && SEND_MAIL="sent"; fi
fi

sleep 10
done

这种方式没有优雅,但至少它有效。可能有另一种方法来实现目标吗?

© www.soinside.com 2019 - 2024. All rights reserved.