Alternativ könntest Du auch einen ANSI-Escape-Code nehmen, z.B. die "gespeicherte Cursorposition":
echo -en 'Los: \e[s9'
for i in 8 7 6 5 4 3 2 1 ; do
echo -en "\e[u$i"
sleep 1
done
Vielleicht gebe ich Dir als Vergleichsobjekt einfach mal meine Stoppuhr, die ich mir vor Zeiten gebastelt habe:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 | #!/bin/bash
echo " ----------- Stoppuhr ----------- Start / Stop mit der Leertaste" > /dev/stderr
echo " Zwischenzeit mit [Enter]" > /dev/stderr
echo -en " Zeit: 0:00.00" > /dev/stderr
while read -n1 ; do # starten
[ "$REPLY" = " " ] && break
done
dat1=$(date +%s%N)
dat10=1${dat1: -9:2}
dat1=${dat1%?????????}
while true ; do
read -n1 -t0.02 # Taste auslesen
dat2=$(date +%s%N)
dat20=1${dat2: -9:2}
dat2=${dat2%?????????}
dat=$(( (dat2 - dat1) * 100 + dat20 - dat10 )) # Zeitdifferenz berechnen
std=$(( $dat / 360000 ))
min=$(( $dat % 360000 / 6000 ))
sec=$(( $dat % 6000 / 100 ))
hun=$(( $dat % 100 ))
if [ $std -eq 0 ]; then # Live-Ausgabe der Zeit auf /dev/stderr
printf "\r\t\t%6d:%2.2d.%2.2d\e[K" $min $sec $hun > /dev/stderr
else
printf "\r\t\t%3d:%2.2d:%2.2d.%2.2d\e[K" $std $min $sec $hun > /dev/stderr
fi
[ "$REPLY" = " " ] && break # stoppen
done
printf "\r\t\t" > /dev/stderr
if [ $std -eq 0 ]; then # Schluss-Ausgabe der Zeit auf /dev/stdout
printf "%6d:%2.2d.%2.2d\n" $min $sec $hun
else
printf "%3d:%2.2d:%2.2d.%2.2d\n" $std $min $sec $hun
fi
echo > /dev/stderr
|
Wundere Dich bitte nicht, dass ich beim read nur eine Zeitauflösung von 2/100 s zeige. Weniger macht keinen Sinn, denn der Bildschirm ist nicht schneller.
Aber immerhin ermittle ich die absolute Zeit dann aus der Systemuhr, so dass da keine Fehler entstehen können.
LG,
track