有没有办法让脚本动态化?

有没有办法让脚本动态化?

我需要我的脚本来显示直到下次运行的时间,像计时器一样连续,这可能吗?

答案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 $meconds值预计会以 15 秒的间隔递减$s$s(尽管这很容易改变)。无论如何,请记住这一点。

相关内容