Frage Bash Skript Countdown 5 Minuten Anzeige auf einer Zeile [geschlossen]


Ich möchte einen Countdown von 5 Minuten haben, jede Sekunde aktualisieren und das Ergebnis in derselben Zeile anzeigen. Ist das überhaupt möglich mit Bash Scripting?


20
2017-08-21 09:37


Ursprung


Was macht der Countdown? Sie müssen etwas genauer über die ganze Sache sein. - Adrian Frühwirth
Dies ist absolut möglich. Wenn Sie uns mitteilen, warum (welches System- / Netzwerkadministrationsproblem Sie lösen möchten), können wir Ihnen sagen, welche der vielen verfügbaren Methoden für Sie am besten geeignet ist. Wenn es ein allgemeiner "Wie mache ich das in einem bash Skript? Frage deine Frage ist wahrscheinlich besser geeignet für Unix und Linux - lass es mich wissen und ich kann es für dich dorthin migrieren :) - voretaq7
Hier ist ein Weg github.com/himanshub16/MyScripts/blob/master/countdown.sh - Himanshu Shekhar


Antworten:


Dies funktioniert von Bash Shell:

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

Das besondere Zeichen \ 033 [OK stellt ein Zeilenende dar, das den Rest der Zeile bereinigt, wenn noch Zeichen von der vorherigen Ausgabe übrig sind \ r ist ein Wagenrücklauf, der den Cursor an den Anfang der Zeile bewegt. Es gibt einen netten Thread über diese Funktion bei stackoverflow.com.

Sie können eigene Befehle oder was auch immer in der while-Schleife hinzufügen. Wenn Sie etwas spezifischeres benötigen, geben Sie mir bitte mehr Details an.


33
2017-08-21 09:45



Meinst du \ 033 [K wie pro ascii-table.com/ansi-escape-sequences.php statt 0K? - Jody Lee Bruchon


Hier ist eine mit einer Verbesserung des rechten Ausgabeformats (HH: MM: SS) mit korrekten 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, die folgendermaßen aussieht:

02:04:15

12
2017-08-21 11:47



Die Ausgabe ist nicht ganz HH:MM:SS. Für einzelne einstellige Minuten oder Sekunden konnten Sie sehen 00:4:5. - chishaku