ubuntuusers.de

Countdown-Timer: vernünftige Anzeige in einer Zeile

Status: Gelöst | Ubuntu-Version: Xubuntu 10.04 (Lucid Lynx)
Antworten |

Relationalist

Anmeldungsdatum:
17. Juni 2008

Beiträge: 1135

Hallo.

Dies ist keine Hausaufgabe oder dergleichen. Ich brauche nur eine einfache Eieruhr und habe jetzt wenig Zeit, mich reinzudenken.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#! /bin/sh
echo enter number of minutes to countdown
read x
if [ -n "$x" ]; then
count=$(( (x)*60000 ))
else
count=60000
fi

while [ $count -ge 0 ]

do
echo $count seconds
count=`expr $count - 1`
done
mplayer alarm1.wav

Wie mache ich in dieses Konzept eine vernünftige Ausgabe rein: in einer Zeile verbleibend und am besten nur volle-Sekunden-weise anzeigend. Ideal wäre mmm:ss

Danke!

theinlein

Anmeldungsdatum:
29. Dezember 2007

Beiträge: 1279

Hi,

in einer Zeile bleiben kann man, indem man "echo" verwendet und diesem "echo" sagt, dass es kein Newline ausgeben soll aber zusätzlich einen Zeilenrücklauf.

ix=10
while [ $ix -gt 0 ]
do
  echo -ne "$ix  \r"
  sleep 1
  let ix=$ix-1
done

... nur so mal als Beispiel

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

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

Relationalist

(Themenstarter)

Anmeldungsdatum:
17. Juni 2008

Beiträge: 1135

Danke. Hab jetzt wie gesagt keine Zeit, aber damit werde ich weiterkommen! 👍

Ryuno-Ki

Avatar von Ryuno-Ki

Anmeldungsdatum:
7. März 2011

Beiträge: 1105

Wohnort: Stuttgart

Gibt es deine Eieruhr für Xfce vielleicht schon? ▶ Xfce Panel Plugins (Abschnitt „Timer-Plugin“).

Antworten |