Kategorien
Allgemein

Bash: „for“ Schleifen

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

Von der_metzger

Hi, ich bin Jan Kuehnel - Fachinformatiker für Systemintegration ,Linux-Benutzer und Blogger. Seit 2019 arbeite ich als Systemadministrator bei einem beliebten deutschen Fahrradverleih und zuvor über 10 Jahren bei einem großen deutschen Provider. Ich folge seit meiner Kindheit dem Hobby, technische Rätsel zu lösen.