Next: Funktionen
Up: shell
Previous: Wenn, dann ...
Unterabschnitte
Alle Schleifen werden mit den Kommandos do
und done
eingefaßt. (done
statt od
, das
gibt's schon!)
Syntax:
for var [ in liste ]
do
tu_was
done
Der Variablen werden der Reihe nach alle Werte aus liste
zugewiesen. Wenn man alle
Kommandozeilenparameter abarbeiten möchte, kann man das in liste
auch weglassen, wegen der
häufigen Verwendung ist das eine eingebaute Abkürzung.
Schleifen kann man, wie in C
, mit break
verlassen und mit continue
an den
Anfang der Schleife zurückschicken.
[britta@Wintermute tars]$ cat ../untar
for i in *.t*gz
do
tar -xzf "$i" && rm -rf "$i"
done
[britta@Wintermute tars]$ ls
. .. downloads.tar.gz shell.tgz
[britta@Wintermute tars]$ ../untar
gzip: stdin: unexpected end of file
tar: Archive downloads.tar.gz EOF not on block boundary
tar: Error is not recoverable: exiting now
[britta@Wintermute tars]$ ls
. downloads shell.aux shell.log
.. downloads.tar.gz shell.dvi shell.tex
[britta@Wintermute shell]$ cat do_pov
for i
do
for j in "$i"/*.pov
do
png=`echo "$j" | sed -e 's/pov$/png/'`
if [ ! -e $png ]
then
cd "$i" && povray -i "$j" +L "$i"
fi
done
done
[britta@Wintermute shell]$ do_pov /usr/doc/povray-misc/pov3demo/*
Persistence of Vision(tm) Ray Tracer Version 3.01.Linux.gcc
...
Beim ersten Kommando war die Datei downloads.tar.gz
korrupt und wurde nicht gelöscht. ve
while cond
do
tu_was
done
until cond
do
tu_was
done
Die while
-Schleife führt die Kommandos in ihrem Rumpf solange aus, wie die Bedingung wahr
ist, d.h. der Rückgabewert des Kommandos 0 ist. Die until
-Schleife ist genau umgekehrt:
solange, wie das Kommando cond
nicht 0 zurückliefert, wird der Rumpf ausgeführt.
[britta@Wintermute shell]$ cat sqrt
u=0
v=1
w=1
while [ "$w" -le $1 ]
do
u=`expr "$u" + 1`
v=`expr "$v" + 2`
w=`expr "$w" + $v`
done
echo $u
[britta@Wintermute shell]$ sqrt 25
5
[britta@Wintermute shell]$ time sqrt 123456789
11111
real 7m22.453s
user 2m41.930s
sys 3m36.280s
[britta@Wintermute britta]$ cat countdown
i="$1"
until [ "$i" -eq 0 ]
do
echo ..."$i"
i=`expr "$i" - 1`
sleep 1s
done
echo ...and liftoff!!!
[britta@Wintermute britta]$ countdown 10
...10
...9
...8
...7
...6
...5
...4
...3
...2
...1
...and liftoff!!!
Wenn kein Kommando ausgeführt wurde, weil die Bedingungen nicht stimmten, liefern if, while
und until
0 zurück, sonst den Rückgabewert des letzten ausgeführten Kommandos.
[britta@Wintermute shell]$ cat imposs
while [ 100 -eq 1 ]
do
mail -s "Hallo!" root
done
echo $?
[britta@Wintermute shell]$ imposs
0
Man kann Kontrollstrukturen auch umleiten oder pipen, da jede Kontrollstruktur als nur ein Kommando
gilt. Damit erhält man Subshells, aber man hat weniger Prozesse, wenn man z.B. die gesamte Schleife
an awk
piped und nicht jedesmal einen neuen awk
-Prozeß startet.
[britta@Wintermute shell]$ cat watchfile
file="$1"
log=watchfile$$.log
tmp=/tmp/watchfile$$.cpy
cat "$file" > "$tmp"
touch "$log"
while :
do
diff "$tmp" "$file" || date
cat "$file" > "$tmp"
sleep 5
done > "$log"
[britta@Wintermute shell]$ echo hallodidudeldoe > bla
[britta@Wintermute shell]$ watchfile bla&
[1] 4273
[britta@Wintermute shell]$ echo hallo > bla
[britta@Wintermute shell]$ cp shell.aux bla
[britta@Wintermute shell]$ kill 4273
[britta@Wintermute shell]$ cat watchfile4273.log
1d0
< hallodidudeldoe
Sat Jun 5 16:40:43 CEST 1999
0a1
> hallo
Sat Jun 5 16:40:53 CEST 1999
1d0
< hallo
Sat Jun 5 16:41:08 CEST 1999
0a1,14
> \relax
...
Sat Jun 5 16:41:13 CEST 1999
Next: Funktionen
Up: shell
Previous: Wenn, dann ...
Britta Koch
1999-06-18