Bashスクリプトが1行に5分のカウントダウンを表示する[終了]


23

5分カウントダウンして、毎秒更新し、同じ行に結果を表示したいと思います。これはBashスクリプトでも可能ですか?


カウントダウンは何をしますか?全体についてもう少し具体的にする必要があります。
エイドリアン・フリューワート

これは絶対に可能です。理由(解決しようとしている実際のシステム/ネットワーク管理の問題)を教えていただければ、利用可能な多くの方法のどれがあなたに最適であるかをお伝えできます。それは一般的には「私はこれをどのように行うのですかどうbash?スクリプト`質問は、あなたの質問は、おそらくより良いに適しているのUnixとLinux -私が知っていると私はあなたのためにそこにそれを移行することができます:)
voretaq7

回答:


42

これはBashシェルから機能します。

secs=$((5 * 60))
while [ $secs -gt 0 ]; do
   echo -ne "$secs\033[0K\r"
   sleep 1
   : $((secs--))
done

特殊文字\ 033 [OKは、前の出力から文字が残っている場合に残りの行を削除する行末を表し、\ rはカーソルを行頭に移動するキャリッジリターンです。stackoverflow.comにこの機能に関する素晴らしいスレッドがあります。

独自のコマンドまたはwhileループに何でも追加できます。より具体的なものが必要な場合は、詳細をお知らせください。



私は入れて\r(最初の文字を非表示にすることを防ぐ)行の末尾にカーソルを置くために最初に。更新されたバージョンは次のとおりです。gist.github.com / boillodmanuel / 676b3af823fae4177f1d0b41a6f23442 ありがとう
user1067920

13

適切な先行ゼロとサポート時間を使用して、正しい出力形式(HH:MM:SS)を改善したものを次に示します。

#!/bin/bash

m=${1}-1 # add minus 1 

Floor () {
  DIVIDEND=${1}
  DIVISOR=${2}
  RESULT=$(( ( ${DIVIDEND} - ( ${DIVIDEND} % ${DIVISOR}) )/${DIVISOR} ))
  echo ${RESULT}
}

Timecount(){
        s=${1}
        HOUR=$( Floor ${s} 60/60 )
        s=$((${s}-(60*60*${HOUR})))
        MIN=$( Floor ${s} 60 )
        SEC=$((${s}-60*${MIN}))
     while [ $HOUR -ge 0 ]; do
        while [ $MIN -ge 0 ]; do
                while [ $SEC -ge 0 ]; do
                        printf "%02d:%02d:%02d\033[0K\r" $HOUR $MIN $SEC
                        SEC=$((SEC-1))
                        sleep 1
                done
                SEC=59
                MIN=$((MIN-1))
        done
        MIN=59
        HOUR=$((HOUR-1))
     done
}

Timecount $m

次のような出力が得られます。

02:04:15

出力は完全ではありませんHH:MM:SS。1桁の分または秒の場合、が表示され00:4:5ます。
着尺
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.