Springe zum Hauptinhalt

Bourne
next up previous contents
Next: while-Kommando Up: Ablaufsteuerung Previous: test-Kommando

for-Kommando

  • Beispiel:
    #!/bin/sh
    #
    # lsdir (Version 1): 
    # Aufruf: lsdir1 <verz_1> [<verz_2> ... ]
    #
    for i
    do   ls -l $i | grep '^[Dd]'
    done
    
    


    Für jedes Aufrufargument wird die Pipeline ausgeführt.

  • Problem: bei Aufruf ohne Argument erfolgt keine Anwendung auf aktuelles Verzeichnis, da for-Körper überhaupt nicht abgearbeitet wird
  • Lösung:
    #!/bin/sh
    #
    # lsdir-Version: 
    # Aufruf: lsdir2 <verz_1> [<verz_2> ... ]
    #
    if [ $# -eq 0 ]
    then
    lsdir2 .
    else
        for i
        do   ls -l $i | grep '^[Dd]'
        done
    fi
    
    
  • allgemeine Form des for-Kommando:


    for var [in zk1 zk2 ...zkn ]

    do

        cmd_liste

    done


    Der Shell-Variablen var wird in jedem Zyklus eine Zeichenkette zki zugewiesen und damit cmd_liste abgearbeitet. (Dort wird natürlich auf var Bezug genommen.)

  • Beispiele:
    #!/bin/sh
    #
    # Erzeugen von Files
    #
    # Aufruf:  create <file_1> [<file_2> ...]
    #
    
    if [ $# -eq 0 ]
    then echo "Aufruf: $0 file_1 [file_2 ...]"
    else
         for i
         do
             >$i
         done
    fi
    
    

    #!/bin/sh
    #
    # lsdir-Version fuer das aktuelle Verzeichnis
    #
    # Aufruf: lsdir3
    #
    
    for i in *
    do
         if [ -d $i ]
         then echo $i
         fi
    done
    
    
  • Bemerkung:
    • Metazeichen (z.B. *) erlaubt, d.h. es wird Filenamengenerierung durchgeführt
    • nur Verzeichnisnamen aufgelistet
  • Beispiel:
    #!/bin/sh
    # Ausgabe von Informationen zu einem Nutzerkennzeichen
    # in der Form:
    # NUTZER-KZ: <nkz>   HOME-DIR: ...  LOGIN-SHELL: ...
    #
    # Aufruf: $0 <nkz_1> ...
    
    if [ $# -eq 0 ]
    then
        echo "Aufruf: $0 nutzerkennzeichen ..."
        exit 1;
    fi
    for i in $*
    do
        if grep "^$i:" /etc/passwd >/tmp/nkz$$
        then
            h=`cat /tmp/nkz$$ | cut -f6 -d':'`
            p=`cat /tmp/nkz$$ | cut -f7 -d':'`
            echo "NUTZER-KZ:$i  HOME-DIR:$h  LOGIN-SHELL:$p"
        else echo "NUTZER-KZ $i auf dieser Maschine nicht vorhanden"
        fi
    done
    rm /tmp/nkz$$