Bash Script Countdown 5 Minuten Anzeige in einer Zeile [geschlossen]

23

Ich hätte gerne einen Countdown von 5 Minuten, der jede Sekunde aktualisiert und das Ergebnis in derselben Zeile anzeigt. Ist das überhaupt mit Bash-Scripting möglich?

ptheofan
quelle
Was macht der Countdown? Sie müssen etwas genauer über die ganze Sache sein.
Adrian Frühwirth
Das ist absolut möglich. Wenn Sie uns mitteilen, warum (welches tatsächliche System- / Netzwerkadministrationsproblem Sie lösen möchten), können wir Ihnen mitteilen, welche der vielen verfügbaren Methoden für Sie am besten geeignet sind. Wenn es sich um eine allgemeine bashFrage handelt: "Wie mache ich das in einem Skript?", Ist Ihre Frage wahrscheinlich besser für Unix und Linux geeignet - lassen Sie es mich wissen und ich kann sie für Sie migrieren :)
voretaq7

Antworten:

42

Das funktioniert mit der Bash-Shell:

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

Das Sonderzeichen \ 033 [OK stellt ein Zeilenende dar, das den Rest der Zeile löscht, wenn Zeichen aus der vorherigen Ausgabe übrig sind, und \ r ist ein Wagenrücklauf, der den Cursor an den Zeilenanfang bewegt. Auf stackoverflow.com gibt es einen schönen Thread zu dieser Funktion .

Sie können eigene Befehle oder was auch immer in der while-Schleife hinzufügen. Wenn Sie etwas Spezifischeres benötigen, teilen Sie mir dies bitte mit.

dsmsk80
quelle
Meinen Sie \ 033 [K gemäß ascii-table.com/ansi-escape-sequences.php anstelle von 0K?
Jody Lee Bruchon
Ich setze \ram Anfang den Cursor an das Ende der Zeile (was verhindert, dass das erste Zeichen ausgeblendet wird). Hier ist die aktualisierte Version: gist.github.com/boillodmanuel/676b3af823fae4177f1d0b41a6f23442 Danke
user1067920
13

Hier ist eine mit einer Verbesserung des richtigen Ausgabeformats (HH: MM: SS) mit richtigen führenden Nullen und unterstützenden Stunden:

#!/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

Gibt eine Ausgabe aus, die so aussieht:

02:04:15
rahuL
quelle
Die Ausgabe ist nicht ganz HH:MM:SS. Für einstellige Minuten oder Sekunden könnte man sehen 00:4:5.
Chishaku