2014-01-21 13 views
6

Ich muss auf jeden Tastendruck in einer Countdown-Timer-Schleife zu hören. Wenn eine Taste gedrückt wird, sollte der Countdown-Timer aus der Schleife ausbrechen. Dies funktioniert meistens bis auf die Eingabetaste, wodurch der Countdown-Timer schneller läuft.Bash Skript Countdown-Timer muss jede Taste zum Fortfahren

#!/bin/bash 
for ((i=30; i>0; i--)); do 
    printf "\rStarting script in $i seconds. Hit any key to continue." 
    read -s -n 1 -t 1 key 
    if [[ $key ]] 
    then 
     break 
    fi 
done 
echo "Resume script" 

Ich kann einfach keine Beispiele finden, wie man den Enter-Schlüssel irgendwo online entdecken kann.

Antwort

5

Ich denke, basierend auf dem Returncode read gibt es eine Arbeit für dieses Problem. Von der man Seite von read,

The return code is zero, unless end-of-file is encountered, read times out, 
or an invalid file descriptor is supplied as the argument to -u. 

Der Rückgabecode für Timeout scheint 142 zu sein [prüft in Fedora 16]

So kann das Skript als,

#!/bin/bash 
for ((i=30; i>0; i--)); do 
    printf "\rStarting script in $i seconds. Hit any key to continue." 
    read -s -n 1 -t 1 key 
    if [ $? -eq 0 ] 
    then 
     break 
    fi 
done 
echo "Resume script" 
+0

Gute Arbeit für einen "Hit any key" übrigens. Einfach! –

1

Das Problem ist, dass read würde standardmäßig eine Newline als Trennzeichen betrachten.

Set der IFS zu vermeiden null bis das Trennzeichen zu lesen.

Sprich:

IFS= read -s -N 1 -t 1 key 

statt, und Sie würden das erwartete Verhalten bekommen auf die Taste während des read Enter drücken.

+0

Leider ist dieses modifiziert werden verursachte das gleiche Verhalten, das ich bekam. Die Eingabetaste würde einfach mit der nächsten Schleifeniteration fortfahren. Ich habe ähnliche Lösungen wie deine gesucht, aber ich habe nie eine gefunden. –