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

Linux 如何在无限循环中执行一次命令,linux,bash,infinite-loop,Linux,Bash,Infinite Loop,这里有一个代码的概念: while true; do *check variable* if [ variable == true ]; then *command1 to execute* . . . *commandN to execute* fi done 如何在不离开此循环的情况下仅执行一次command1? 显然,当变量为true时,command1应该只执行一次 编辑:我不想离开循环,因为它是无头debian家庭服务器/存储设备监控脚本的一部分。Check变量用于检查VPN连接是否

这里有一个代码的概念:

while true; do
*check variable*
if [ variable == true ]; then
*command1 to execute*
.
.
.
*commandN to execute*
fi
done
如何在不离开此循环的情况下仅执行一次command1? 显然,当变量为true时,command1应该只执行一次


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

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

有一个更接近实际的示例: 我想连续监控音频输出。 如果音频接收器未设置为HDMI,我不希望看到每10秒出现一次屏幕提醒,但仅在发生时发送一次

因此:

你知道怎么只发一次邮件吗


也许有另一种方法可以找到解,而不是无限循环

我终于设法用另一个变量完成了

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

这种方式没有优雅之处,但至少是有效的。是否有其他方法可以实现该目标?

在下一次迭代之前将变量设置为false。与空值和非空值相比,语法更简单;shell变量是字符串。为什么不想离开循环?如果变量为true,为什么不直接将command1带出来并执行它呢?
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