【问题标题】:How to execute command once in an infinite loop如何在无限循环中执行一次命令
【发布时间】:2019-03-07 20:14:35
【问题描述】:

有一个代码思路:

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

command1 如何只执行一次而不离开这个循环? 很明显command1应该在variable为真的时候每次只执行一次吧?

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

【问题讨论】:

  • 在下一次迭代之前将变量设置为 false。 (如果比较空值和非空值,语法会更简单;shell 变量是字符串。)
  • 你为什么不想离开循环?如果变量为真,为什么不直接将 command1 带出并执行它?

标签: linux bash infinite-loop


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有一个更接近现实生活的例子: 我想持续监控音频输出。 如果音频接收器未设置为 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
    

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

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

    【讨论】:

      【解决方案3】:

      我终于设法在涉及另一个变量的情况下做到了。

      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
      

      这种方式并不优雅,但至少它有效。是否有其他方法可以实现目标?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-26
        相关资源
        最近更新 更多