我需要我的脚本来显示直到下次运行的时间,像计时器一样连续,这可能吗?
答案1
就像是
t=1
until [ "$t" -le 0 ]
do
t=$(($(date -d '2015-02-24 16:40:00' +'%s')-$(date +'%s')))
sleep 1
tput clear
echo $t
done
答案2
您可以使用 shell 数学来完成大量工作,这样您就不必每隔几秒就 fork 一次,但您可能希望每隔一段时间就使用某种同步器来确保时间保持良好。
下面的循环只是为 , 设置一些初始值$h
,$m
然后$s
每 15 秒递减一次,并在终端屏幕的左上角打印一条倒计时行(第 1 行,第 1 列,\033[Home
)。您可以毫无问题地将其设置为后台,但trap
如果它要运行一段时间,您可能希望首先使用其他工具来保护它。
(h=23 m=1 s=60; trap '' TTOU
until [ "$(((h-=(!(m-=!(s-=s?15:-45)*(m?1:-59))&&!s))+m+s))" -eq 0 ]
do sleep 15
printf "\0337\033[H\033[KT- %02d : %02d : %02d\0338" \
"$h" "$((m?m:60))" "$((s?s:60))"
done) &
它打印的行看起来像这里最上面的一行......
T- 22 : 49 : 60
130 mikeserv@localhost ~ %
130 mikeserv@localhost ~ %
130 mikeserv@localhost ~ % (
h=23 m=1 s=60; trap '' TTOU
我实际上忘记了它仍在运行,但如果终端不滚动,它会继续在同一个地方绘制,就像这样......
T- 22 : 48 : 30
130 mikeserv@localhost ~ %
130 mikeserv@localhost ~ %
130 mikeserv@localhost ~ % (
h=23 m=1 s=60; trap '' TTOU
但是,如果终端确实滚动,则该行将滚出屏幕,直到最多 15 秒过去,然后再打印另一行。使用的转义通常被解释为sc
(保存光标\0337
:),hr
(主行\033[H
:),kl
(杀戮线\033[K
:)和rc
(恢复光标\0338
:)。如果其中任何一个不适合您,您应该检查tput
它们的值。基本上,首先保存光标位置,然后移动到终端屏幕的顶部,擦除顶行,并打印倒计时。光标位置恢复。
它通过平衡减量来工作。
喜欢...
h - !(m - !(s - s < 60 ? 15 : -45 ) && !s )
...还有更多的内容,但该方法只是当较小的值递减到 0 时从较大的值中减去 1。因此,当秒值从 1 递减到 0 时,分钟值也会递减 - 并且当两个都分钟和秒为零,小时值也递减。
当循环完成时......什么也没有发生。我真的不知道你想做什么,但无论是什么,你都应该把它塞在那里done
。
您应该能够以几乎任何值启动,但是,正如所写,$h
$m
econds值预计会以 15 秒的间隔递减$s
$s
(尽管这很容易改变)。无论如何,请记住这一点。