staging.inyokaproject.org

Frage zur Syntax im bash-skript

Status: Gelöst | Ubuntu-Version: Lubuntu 20.04 (Focal Fossa)
Antworten |

Rosika

Anmeldungsdatum:
26. Februar 2016

Beiträge: Zähle...

Hallo zusammen,

nachdem das nützliche "alarm-clock-applet" für die Taskleiste für focal fossa leider nicht mehr zur Verfügung steht, machte ich mich auf die Suche nach einem Countdown-Timer. Diesmal vorzugsweise als bash-skript.

Erreichen möchte ich folgendes:

Eingabe von Stunden, Minuten (evtl. auch Sekunden). Danach soll der Timer herunterzählen (damit ich weiß, wann ich Schluß machen muß 😉 ).

Nach einigem Suchen bin ich hier fündig geworden: https://www.putorius.net/how-to-make-countdown-timer-in-bash.html .

Das Beispielskript habe ich dann so abgeändert, daß der Zeitwert zuerst abgefragt wird und dann der entsprechende Countdown beginnt. Nun sieht es so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

echo "Stunden"
read hour
echo "Minuten"
read min
echo "Sekunden"
read sec
        while [ $hour -ge 0 ]; do
                 while [ $min -ge 0 ]; do
                         while [ $sec -ge 0 ]; do
                                 echo -ne "$hour:$min:$sec\033[0K\r"
                                 let "sec=sec-1"
                                 sleep 1
                         done
                         sec=59
                         let "min=min-1"
                 done
                 min=59
                 let "hour=hour-1"
         done

Eigentlich verstehe ich es im Großen und Ganzen; lediglich zur Syntax in Zeile 12 habe ich noch eine Frage:

1
echo -ne "$hour:$min:$sec\033[0K\r" # echo time on same line so it overwrites last 

"\r" steht für "carriage return" lt. man pages. O.K., aber der vorangehende Part "\033[0K" ist mit unklar.

Weiß dahingehend jemand Genaueres?

Vielen Dank im voraus.

LG. Rosika ☺

woko1754

Anmeldungsdatum:
12. November 2008

Beiträge: 801

Das ist eine ANSI-Escapesequenz und bedeutet nach dieser Tabelle (http://ascii-table.com/ansi-escape-sequences-vt-100.php): "Esc[0K Clear line from cursor right EL0" also Zeile löschen.

\033 = 0x1B = ESC.

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: Zähle...

Hallo woko1754,

herzlichen Dank für die schnelle Antwort. 👍

Auf der von Dir verlinkten Seite habe ich´s gefunden: "Esc[0K" hat also die Bedeutung:

Esc[0K Clear line from cursor right EL0

Soweit ist´s klar, denke ich.

Verstehe ich es dann richtig, daß man "\033" dafür braucht, den anschließenden Ausdruck als Escapesequenz zu interpretieren? ❓

Vielen Dank nochmals

LG. Rosika

woko1754

Anmeldungsdatum:
12. November 2008

Beiträge: 801

Ja, \033 ist octal und bedeutet 27 in dezimal oder 1B in hexadezimal und das steht für 'ESC' in der ASCII-Tabelle.

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: Zähle...

Hi woko1754,

danke fur die super Erklärung.

Ich habe mir die ASCII-Tabelle (https://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange#ASCII-Tabelle ) angesehen und Deine Erläuterung gut nachvollziehen können. 👍

Toll, da habe ich wieder etwas dazu gelernt. 💡

Vielen Dank nochmals für Deine Mühe.

Schönen Sonntag und LG. Rosika 😊

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Ja. "\0" steht für 0ktalzahl. 33 ist somit 3*8+3 = 24 + 3 = 27. In jeder besseren Asciitabelle zu finden: 27=esc. Ein Escapezeichen, das grafisch nicht darstellbar ist.

Statt Oktalschreibweise geht auch echo -ne "$hour:$min:$sec\e[0K\r". Backslash-e für "esc" (surprise).

Test:

1
for i in {1..9}; do echo -ne "8:14:$i\033[0K\r"; sleep 0.2; done

Siehe auch man echo, falls Du es mal vergessen solltest. Echo muss mit -e aufgerufen werden, um solche Escapesequenzen richtig zu deuten. Und mit -n, um nicht sellbst einen Zeilenumbruch hinterherzuschicken.

P.S.: Rechnen bedarf keines Quotings.

1
2
min=7
let min=min-3

Rosika

(Themenstarter)

Anmeldungsdatum:
26. Februar 2016

Beiträge: 1359

Hi user_unknown,

danke für die zusätzliche Erklärung.

Ja, die entsprechenden Optionsschalter für echo hatte ich aus den man-pages bereits herausgefunden. Die waren mir eigentlich klar.

-e, Enable interpretation of backslash escapes -n, Do not output a newline

Lediglich

"\0" steht für 0ktalzahl. 33 ist somit 3*8+3 = 24 + 3 = 27. In jeder besseren Asciitabelle zu finden: 27=esc.

hatte mir Verständnisprobleme bereitet: Jetzt aber habe ich´s verstanden.

Danke auch für Deine Beispiele und die tolle Hilfe.

LG. Rosika. 😀

Antworten |