Next: Primitive Turbo-C-Variante Up: Beispiele für Shell-Programmierung Previous: Selektives Kopieren
Varianten des Sieb-Filters
-
Schreiben Sie einen Filter namens sieb, der nur jede zweite Zeile von stdin -> stdout
kopiert.
#!/bin/sh # # Filter sieb (variante 0) # # Aufruf: sieb0 # a=1 while read n do a=`expr $a '*' -1` if test $a -gt 0 then echo $n fi done
- Problem: In den durchgelassenen Zeilen gehen Leerzeichen verloren, wenn mehrere zusammenhängende Leerzeichen auftreten (read-Kommando)
-
Diese Filter ist zu verallgemeinern. Beim Aufruf sieba +n soll jede n-te Zeile kopiert
werden. Beim Aufruf sieba -n soll jede n-te Zeile ignoriert werden. Für n sollen die
Werte 2 bis 9 zugelassen sein; dies ist zu überprüfen!
#!/bin/sh # # Filter sieba # # Aufruf: sieba +n kopieren jeder n-ten Zeile # sieba -n ignorieren jeder n-ten Zeile # if test $# -ne 1 then echo "Benutze: sieba +n oder sieba -n" echo "1 < n < 10" exit 1 fi x=`echo "$1" | cut -c1` case $x in '-' ) : ;; '+' ) : ;; * ) echo "Benutze: sieba +n oder sieba -n" echo "1 < n < 10" exit 1 ;; esac x=`echo "$1" | cut -c2` case $x in [2-9] ) : ;; * ) echo "Benutze: sieba +n oder sieba -n" echo "1 < n < 10" exit 1 ;; esac a=`echo "$1" | cut -c2` if test "$1" -gt 0 then d=1 else d=0 fi r=$a while read n do a=`expr $a '-' 1` if test $d -eq 0 then if test $a -eq 0 then a=$r continue else echo $n continue fi fi if test $a -eq 0 then echo $n a=$r fi done