スクリプトを動的にする方法はありますか? [閉鎖]

スクリプトを動的にする方法はありますか? [閉鎖]

タイマーのように次回の実行までの時間を表示するには、スクリプトが必要です。可能ですか?

答え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

数秒ごとにフォークする必要がないように、シェル数学を使用して多くのことを行うことができますが、時間を節約するために、ある種の同期デバイスを使用することをお勧めします。

下のループはの初期値を設定して$hから15秒ごとに値を減らし、$m端末$s画面の左上にカウントダウン行を印刷します。(行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 )

...より多くのものがありますが、この方法では、小さい値がゼロに減少すると、大きな値から1を減算します。したがって、秒値が1から0に減少すると、分値も減少します。両方分と秒はゼロで、時値も減少します。

ループが完了したら…何も起こりません。あなたが何をしたいのかわかりませんが、それが何であれ、そこに入れる必要がありますdone

ほぼすべての値から始めることができるはずですが、作成されたとおり、$h $meconds値は15秒間隔で減少すると予想されます。$s$s(これは簡単に変更されますが)。とにかくこの点に注意してください。

関連情報