Wie nutze ich eine „for“ schleife in der Shell. Wie erstelle ich endlose schleifen?
Eine for Schleife erlaubt es Bash-Code wiederholt auszuführen. Eine Schleife ist eine Kontrollstruktur, die wiederholt einen Anweisungs-Block (den Schleifenrumpf oder Schleifenkörper) so lange, wie eine Laufbedingung gültig ist oder eine Abbruchbedingung eintritt abarbeitet.
Schleifen, deren Laufbedingung immer erfüllt ist oder ihre Abbruchbedingung niemals erreichen (oder keine Abbruchbedingung haben) sind Endlosschleifen.
Die Zähl-Schleife:
!/bin/bash
for i in 1 2 3 4 5
do
echo "Schleifendurchlauf $i"
done
Bei dieser Schleifenvariante können auch andere Werte als Zahlen angegeben werden.
Seit Bash Version 3.x gibt es einen eingebauten „range“ Support:
!/bin/bash
for i in {1..5} # die beiden Punke gehören dazu!
do
echo "Schleifendurchlauf $i"
done
In der Bash Version 3.x kann leider noch nicht mit schritt weiten Umgehen, zum Glück gibt es den Linux Befehl „seq“.:
!/bin/bash
for i in $(seq 1 2 20)
do
echo "Schleifendurchlauf $i"
done
Ab Bash Version 4.0+ können auch die Schrittweiten angegeben werden, was bedeutend schneller ist als der Aufruf des externen Programms „seq“. Die Syntax lautet hier: {START..ENDE..SCHRITTWEITE}
!/bin/bash
echo "Bash Version ${BASH_VERSION}"
for i in {0..10..2}
do
echo "Schleifendurchlauf $i"
done
Eine weitere Art der for Schleife ist ein gemeinsames Erbe mit der Programmiersprache C Bestehend aus einer Initialisierung (EXP1), eines Zustands-Tests (EXP2), und eines Zähler Ausdrucks (EXP3).
for (( EXP1; EXP2; EXP3 ))
do
# Wiederholt auszuführender Script-teil
done
Ein einfaches Beispiel für diese Art der Schleife welches bis 5 Zählt sieht dann ungefähr wie folgt aus.:
!/bin/bash
for (( c=1; c<=5; c++ ))
do
echo "Nummer $c …"
done
Und letztendlich die Endlosschleife
In der Endlosschleife werden einfach die 3 Parameter leer gelassen, somit wird die (leere) Abbruchbedingung nie erreicht.
!/bin/bash
for (( ; ; ))
do
echo "Unedliche Schleife! [CTRL]+[C] zum Abbruch"
done
Bedingter Abbruch mit ‚break‘
Eine Schleife kann auch mit dem Befehl ‚break‘ innerhalb der Schleife unterbrochen werden. Ein verlassen mit „break“ ist aus for, while und until Schleifen möglich. Das ganze muss dann so aussehen:
for I in 1 2 3 4 5
do
statements1 #Executed for all values of ''I'', up to a disaster-condition if any.
statements2
if (abbruch-bedingung)
then
break #Verlasse die Schleife
fi
statements3 #Solange die "abbruch-Bedingung nicht erreicht ist
done
Das folgende Shell Script will alle Dateien im Verzeichnis ‚/etc‘ ausgeben, jedoch abbrechen wenn die Datei ‚/etc/resolv.conf‘ erreicht wird.
#!/bin/bash
for file in /etc/*
do
if [ "${file}" == "/etc/resolv.conf" ]
then
countNameservers=$(grep -c nameserver /etc/resolv.conf)
echo "Total ${countNameservers} nameservers defined in ${file}"
break
fi
done
Vorzeitige Fortsetzung der Schleife mit Hilfe der continue-Anweisung
Um den nächsten Durchlauf der umschließenden for, while und until Schleife vorzeitig fortzusetzen wird die Anweisung ‚continue‘ verwendet.
for I in 1 2 3 4 5
do
statements1
statements2
if (Bedingung)
then
continue #Hier aus der Schleife aussteigen und statements3 auslassen
fi
statements3
done
Beispielscript, welches von allen Dateien eine Kopie mit dem Namen *.bak anlegt, wenn am Dateiname bereits .bak enthalten ist wird die Datei übersprungen.
#!/bin/bash
FILES="$@"
for f in $FILES
do
# wenn die .bak Kopie exists, nächste Datei
if [ -f ${f}.bak ]
then
echo "Skiping $f file..."
continue # Nächste Datei lesen, überspringe cp
fi
# Das wir hierher gelangt sind bedeutet es gibt noch keine .bak Datei
/bin/cp $f $f.bak
done