while: Unterschied zwischen den Versionen
Michi (Diskussion | Beiträge) (Die Seite wurde neu angelegt: Die <b>while</b>-Schleife wird wiederholt, solange eine anfangs stehende Bedingung erfolgreich ist (also Exit-Status 0 liefert). Die Abwicklung der Schleife wird da...) |
Michi (Diskussion | Beiträge) |
||
(16 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
Der [[Shell-Befehl]] <b>while</b> bewirkt eine [[Schleife]], welche solange wiederholt wird wie eine anfangs stehende Bedingung erfolgreich ist (also Exit-Status 0 liefert). Die Abwicklung der Schleife wird dabei vom Exit-Status eines Befehls gesteuert. | |||
== Syntax == | == Syntax == | ||
Zeile 11: | Zeile 11: | ||
== Verwendung == | == Verwendung == | ||
Alle | Alle 30 Sekunden soll ein "x" auf den Bildschirm geschrieben werden. Das kann nützlich sein, um eine SSH-Verbindung auf einem zweiten Bildschirm am Leben zu erhalten, wenn etwa auf dem Router "dialer idle-timeout 90" eingestellt ist. | ||
$ <b>while true; do echo -n "x"; sleep | $ <b>while true; do echo -n "x"; sleep 30; done</b> | ||
... | ... | ||
Zeile 26: | Zeile 26: | ||
2 | 2 | ||
3 | 3 | ||
20 Sekunden warten und herunterzählen am Bildschirm. | |||
$ <b>x=20 && while [ $x -gt 0 ]; do let x-=1 && sleep 1; echo -n "$x "; done && echo ""</b> | |||
19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 | |||
---- | ---- | ||
$ <b>while true; do echo $(date '+%H:%M'); sleep 60; done</b> | |||
$ <b>while true</b> | $ <b>while true</b> | ||
Zeile 53: | Zeile 60: | ||
Auf den ersten Eintrag könnte auch mit "echo $array[0]" zugegriffen werden. | Auf den ersten Eintrag könnte auch mit "echo $array[0]" zugegriffen werden. | ||
=== Countdown === | |||
function countdown() | |||
{ | |||
IFS=: | |||
set -- $* | |||
secs=$(( ${1#0} * 3600 + ${2#0} * 60 + ${3#0} )) | |||
PREFIX="$4" ; [ -n "${PREFIX}" ] && PREFIX="${PREFIX}: " | |||
while [ $secs -gt 0 ] | |||
do | |||
sleep 1 & | |||
printf "\r%s%02d:%02d:%02d" "${PREFIX}" \ | |||
$((secs/3600)) $(( (secs/60)%60)) $((secs%60)) | |||
secs=$(( $secs - 1 )) | |||
wait | |||
done | |||
printf "\r%s%02d:%02d:%02d" "${PREFIX}" | |||
echo | |||
} | |||
countdown "00:00:03" "Auf geht's" | |||
<!-- | |||
Countdown im Terminal: | |||
clear && for i in $(seq -10 0); do clear && tput cup 1 0 && echo "$i"; sleep 1; done | |||
--> | |||
Aktuelle Version vom 2. Dezember 2015, 09:05 Uhr
Der Shell-Befehl while bewirkt eine Schleife, welche solange wiederholt wird wie eine anfangs stehende Bedingung erfolgreich ist (also Exit-Status 0 liefert). Die Abwicklung der Schleife wird dabei vom Exit-Status eines Befehls gesteuert.
Syntax
Die Shell führt Befehlsliste2 nur dann aus, wenn der letzte Befehl aus Befehlsliste1 den Exit-Status 0 geliefert hat. Nach jedem Schleifendurchlauf führt die Shell Befehlsliste1 erneut aus.
while Befehlsliste1 do Befehlsliste2 done
Verwendung
Alle 30 Sekunden soll ein "x" auf den Bildschirm geschrieben werden. Das kann nützlich sein, um eine SSH-Verbindung auf einem zweiten Bildschirm am Leben zu erhalten, wenn etwa auf dem Router "dialer idle-timeout 90" eingestellt ist.
$ while true; do echo -n "x"; sleep 30; done
...
$ x=0 $ while test $x -lt 3 > do > let x+=1 > echo ${x} > done 1 2 3
20 Sekunden warten und herunterzählen am Bildschirm.
$ x=20 && while [ $x -gt 0 ]; do let x-=1 && sleep 1; echo -n "$x "; done && echo "" 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
$ while true; do echo $(date '+%H:%M'); sleep 60; done
$ while true > do > banner $(date '+%H:%M') > sleep 60 > done
Mit der folgenden Schleife können beliebig viele Parameter ausgewertet werden. Durch "( $@ )" wird dabei die Parameterkette an den Leerzeichen in einzelne Abschnitte aufgespalten un nacheinander in ein eindimensionales Array gespeichert.
#!/bin/bash declare -i i=0 array=( $@ ) while [ $i -le $# ]; do echo "Inhalt von array[$i]: ${array[$i]}" i=$i+1 done $ ./while.sh 1 2 "3 4 5" Inhalt von array[0]: 1 Inhalt von array[1]: 2 Inhalt von array[2]: 3 Inhalt von array[3]: 4
Auf den ersten Eintrag könnte auch mit "echo $array[0]" zugegriffen werden.
Countdown
function countdown() { IFS=: set -- $* secs=$(( ${1#0} * 3600 + ${2#0} * 60 + ${3#0} )) PREFIX="$4" ; [ -n "${PREFIX}" ] && PREFIX="${PREFIX}: " while [ $secs -gt 0 ] do sleep 1 & printf "\r%s%02d:%02d:%02d" "${PREFIX}" \ $((secs/3600)) $(( (secs/60)%60)) $((secs%60)) secs=$(( $secs - 1 )) wait done printf "\r%s%02d:%02d:%02d" "${PREFIX}" echo } countdown "00:00:03" "Auf geht's"