Springe zum Hauptinhalt

Bourne
next up previous contents
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