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

How to influence a bash while loop with a timed global variable?

我在 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 "${r}s"
        i=$((i + r))
        echo "$i"
    fi
done

问题是 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 "${r}s"
        i=$((i + r))
        echo "$i"
    fi
done