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.