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

时间:2019-03-07 20:14:36

标签: linux bash infinite-loop

有一个代码想法:

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

如何只执行一次 command1 而又不离开此循环? 显然,每次 variable 为true时, command1 应该只执行一次?

编辑:我不想离开循环,因为它是无头Debian家用服务器/存储设备的监视脚本的一部分。 Check变量是检查VPN连接是否打开。或者,如果文件夹中有新文件。或者,如果有新用户登录。触发器可能不计其数。 Command1正在发送有关它的电子邮件通知。或将新行写入自定义日志文件。同样,无数的应用程序。我不想每次迭代都被邮寄。这是关于永无休止地检查状态并在状态更改后执行命令的全部操作。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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" me@somwhere.com # <-PART OF CODE TO BE EXECUTED ONCE
fi

sleep 10
done

有什么想法只发送一次电子邮件吗?

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

答案 2 :(得分: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" me@somwhere.com && SEND_MAIL="sent"; fi
fi

sleep 10
done

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