Bash-Programmierung: Schleifen

closeDieser Beitrag wurde vor mehr als drei Monaten veröffentlicht. Bedenke bitte, dass die hier angebotene Information nicht mehr aktuell und gültig sein könnte. Informiere dich daher bitte auch an anderer Stelle über dieses Thema. Sollten sich neue Informationen ergeben haben, so kannst du mich auch gerne auf diese über einen Kommentar hinweisen. Vielen Dank!

Eine Endlosschleife erzeugen wir nun, indem wir einfach eine Bedingung wählen, die immer erfüllt ist… dies könnte man z.B. wie folgt machen:

while true; do date; sleep 5; done

Dies kann man jedoch auch sehr viel einfacher haben und zwar mit “watch”:

watch -n5 "date"

Wenn die Schleife jedoch noch einigen Durchläufen beendet werden soll, kann man dies z.B. so machen:

for i in`seq 1 50` ; do echo $i ; date ; sleep 5 ; done

Hier noch ein paar Beispiele:

#!/bin/sh

ANZAHL=0
echo "until-Loop"
# gt = groesser

until [ ${ANZAHL} -gt 10 ] ; do
        echo ${ANZAHL}
        ANZAHL=`expr ${ANZAHL} + 1`
done

# ------------------------------------

ANZAHL=0
echo "while-Loop"
# gt = kleiner/gleich

while [ ${ANZAHL} -le 10 ]
        do
        echo ${ANZAHL}
        ANZAHL=`expr ${ANZAHL} + 1`
done

# ------------------------------------

echo "For-Loop"
# seq = sequenz

for i in `seq 0 10`
        do
        echo $i
        done
exit

# ------------------------------------

Zum Schluss noch ein Beispiel aus der Praxis:

for I in $(ps aux|grep "apache"| awk {'print $2'}); do kill -9 $I; done

vielleicht auf den ersten Blick ein wenig konfus, aus den zweiten Blick erkennt man jedoch, dass mittels ps nach “apache” gesucht wird, die PID-Nunner per awk herausgenommen und diese Programme dann getötet werden.

  • Tom

    Hallo, ich bin gerade über einen anderen Artikel hier her gekommen und habe da noch einen kleinen Tipp zur Verkürzung der For-Schleifen:

    for (i=0;i<11;i++)
    do
    echo $i
    done

    oder als Einzeiler:

    for (i=0;i<11;i++); do echo $i; done

    Gruß Tom

  • http://suckup.de Voku

    … hier noch ein Beispiel mit “line”!!!

    for line in $(cat test.txt); do echo $line; done;

  • Daniel

    Zu dem ersten for Beispiel:
    seq gibt es nicht auf allen Unix Systemen.

    Daher ist folgendes besser:
    for i in {1..20} ; do echo $i ; date ; sleep 5 ; done

    kommt aufs gleiche raus und muss nicht ein weiterer Prozess gestartet werden :-)