如何使用定时全局变量影响 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 循环并保留变量