如何使用定时全局变量影响 bash while 循环?

Posted

技术标签:

【中文标题】如何使用定时全局变量影响 bash while 循环?【英文标题】:How to influence a bash while loop with a timed global variable? 【发布时间】:2015-09-26 19:51:41 【问题描述】:

我在bash 脚本中有一个while 循环,它应该在开始时和每5 秒间隔做一些不同的事情。允许完成任何先前的循环。 5s 间隔由heartbeat 函数设置的do_different 全局变量指示。另一个复杂情况是正常的while 循环在未知的时间内完成(在下面的脚本中用RANDOM 进行了简化)。 使用cron 不是一种选择,也不是为随机过程计时。

我已经尝试过使用管道和进程替换,但均未成功。 整个脚本可能会被重构。

#!/bin/bash

function heartbeat 
    do_different=true
    while sleep 5s
    do
        do_different=true
    done


heartbeat &

while true
do
    if $do_different
    then
        echo 'Something different'
        do_different=false
        i=0
    else
        # process of random duration; not important
        r=$(( 1 + RANDOM % 3 ))
        sleep "$rs"
        i=$((i + r))
        echo "$i"
    fi
done

【问题讨论】:

我认为 set -m 是你要找的...***.com/questions/1455695/… 【参考方案1】:

问题是while 循环是在一个新的子shell 中执行的,它有自己的全局变量副本。 有很多possible workarounds。将所有命令分组到子 shell 中对我来说很有效。

#!/bin/bash

t_lastdue=$(date --date='5seconds ago' +%s)

while true
do
    t_now=$(date +%s)
    t_elapsed=$((t_now - t_lastdue))
    if [ $t_elapsed -ge 5 ]
    then
        echo 'Something different'
        t_lastdue=$((t_lastdue + 5))
        i=0
    else
        # process of random duration; not important
        r=$(( 1 + RANDOM % 3 ))
        sleep "$rs"
        i=$((i + r))
        echo "$i"
    fi
done

【讨论】:

以上是关于如何使用定时全局变量影响 bash while 循环?的主要内容,如果未能解决你的问题,请参考以下文章

如何在循环结束后将输入传送到 Bash while 循环并保留变量

while循环创建用户(区别for)

如何在不使用全局变量的情况下在 bash 中返回一个数组?

如何编写 bash 脚本来设置全局环境变量?

Mac OSX - 如何在bash_profile中配置全局环境变量

Bash shell在while循环后“清除”一个变量,如何获取变量内文件夹中的所有文件? [复制]