next up previous
Next: Funktionen Up: shell Previous: Wenn, dann ...

Unterabschnitte

Schleifen

Alle Schleifen werden mit den Kommandos do und done eingefaßt. (done statt od, das gibt's schon!)

for-Schleifen

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 und until


    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 up previous
Next: Funktionen Up: shell Previous: Wenn, dann ...
Britta Koch
1999-06-18