Home

Update: 10. März 2017 

An der Ausgabe der Uptime habe ich mir lange Zeit die Finger blutig getippt. Das Problem dabei ist nicht die Anzeige, wie lange der Rechner schon läuft, sondern eine schöne Formatierung in deutscher Sprache.

Der Befehl "uptime" im Terminal, zeigt zwar (unter Anderem) auch die Laufzeit des Systems an, allerdings nur ganz rudimentär formatiert. Ich hatte bereits ein funktionierendes Skript, der Code war aber grauenhaft. Jeder Ausgabefehler wurde mit einer neuen if..then Abfrage korrigiert. Dadurch habe ich ein wahres Verzweigungsmonster gebaut. Hier das neue, schlanke Skript: 

01: einheit=$(uptime | awk '{print $4 }' | sed 's/,//' | sed 's/s//')
02: subeinheit=$(uptime | awk '{print $6 }' | sed 's/,//' | sed 's/s//')
03: ok=false

04: case "$einheit" in
05: "ecs") ausgabe=$(uptime | awk '{print $3+0 " " $4}' | sed 's/secs,/Sekunden/');ok=true;;
06: "min" ) ausgabe=$(uptime | awk '{print $3+0 " " $4}' | sed 's/mins,/Minuten/' | sed 's/min,/Minute/');ok=true;;
07: "hr") ausgabe=$(uptime | awk '{print $3+0 " " $4}' | sed 's/hrs,/Stunden/' | sed 's/hr,/Stunde/');ok=true;;
08: esac

09: if [ "$ok" = "false" ]
10: then
11: if [ "$einheit" = "day" ] || [ "$einheit" = "days" ]
12: then
13: if [ "$subeinheit" = "ecs" ]
14: then
15: ausgabe=$(uptime | awk '{print $3 " " $4 " " $5 }' | sed 's/days,/Tage/' | sed 's/day,/Tag/')" Sekunden"
16: elif [ "$subeinheit" = "min" ]
17: then
18: ausgabe=$(uptime | awk '{print $3 " " $4 " " $5 }' | sed 's/days,/Tage/' | sed 's/day,/Tag/')" min"
19: else
20: ausgabe=$(uptime | awk '{print $3 " " $4 " " $5 }' | sed 's/days,/Tage/' | sed 's/day,/Tag/' | sed 's/:/h /' | sed 's/,/min/')
21: fi
22: else
23: ausgabe=$(uptime | awk '{print $3 }' | sed 's/:/h /' | sed 's/,/min/')
24: fi
25: fi

26: echo "Uptime: \t\t\t $ausgabe"

Zeile 1:
Die "größte" Einheit der Laufzeit wird abgefragt. Wenn der Rechner gerade gestartet wurde, dann lautet sie "secs", und steigert sich über "mins" bis "days".

Zeile 2:
Es wird eine Untereinheit abgefragt. Wenn der Rechner mehr als einen Tag läuft beginnt die Ausgabe nach "1 day" ärgerlicherweise wieder mit "secs", steigert sich dann auf "min". Um die Einteilung in Einheit und Untereinheit besser zu verstehen seht Euch am Besten mal die Ausgabe von "uptime" nach unterschiedlichsten Laufzeiten mal an.

Zeile 3:
Die Variable "ok" ist eine Hilfsvariable. Sie wird mit "false" initialisiert.

Zeile 4 bis 8:
Über eine case..in Verzweigung wird die Augabe generiert falls die Haupteinheit Sekunden, Minuten oder Stunden beträgt. Das bedeutet der Zeitraum vom Start des Rechners bis zur ersten vollen Stunde und jede weitere volle Stunde wird mit dieser Verzweigung abgedeckt. Wenn die case..in Verzweigung erfolgreich war wird die Hilfsvariable "ok" mit "true" belegt. 

Zeilen 9 und 10:
Wenn die case..in Verzweigung die nicht erfolgreich war, geht es mit den nächsten Abfragen weiter.

Zeilen 11 bis 15:
Wenn der Rechner gerade die vollen Tage überschritten hat, wird hiermit die erste Minute (Zeitanzeige in Sekunden) abgedeckt.

Zeilen 16 bis 18:
Der Zeitraum nach dem Überschreiten eines vollen Tages ab der ersten Minute bis zur ersten Stunde wird hiermit angezeigt.

Zeile 20:
Die Ausgabe in Tagen, Stunden und Minuten wird generiert.

Zeile 23:
Der Zeitraum nach der ersten Stunde bis zum Tageswechsel wird abgedeckt.

Zeile 26:
Die Ausgabe wird auf dem Bildschirm ausgegeben 

Die Formatierung der Ausgabe von "uptime" ist sehr uneinheitlich und deshalb müssen hier so viele unterschiedliche Situaionen abgedeckt werden. Ich sammele mal bei Gelegenheit diverse Ausgaben um hier die Problematik nochmal genauer aufzuzeigen.

Alle Skripte findet Ihr zum Download auf Github. Verbesserungen sind willkommen!