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?


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.


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

Die Ausgabe ist nicht ganz HH:MM:SS. Für einstellige Minuten oder Sekunden könnte man sehen 00:4:5.
— Chishaku
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.