Aus LinuxUser 06/2015

Schleifen in der Shell (Seite 2)

Listing 4

#!/bin/sh
echo "Bestimmen des Dateityps in einer For-Schleife"
for k in $(ls -1); do
  echo "---------------------------------------------"
  file $k | fold -sbw 50
done
echo "---------------------------------------------"
echo -e "\nVerwendung einer Textdatei als Werteliste\n"
for k in $(cat eingabe.txt); do
  echo $k
done
echo -e "\nDatenbankabfrage (Postgres) als Datenquelle\n"
for k in $(psql -t -c "select orgnr from versuch where zahl < 500;"); do
  echo $k
done
Abbildung 3: Der Ablauf des Shellskripts aus Listing 4.
Abbildung 3: Der Ablauf des Shellskripts aus Listing 4.

While- und Until-Schleifen

Die While-Schleife läuft durch, solange die im Kopf angegebene Bedingung erfüllt wird. Unabhängig von der im Schleifenkopf gestellten Bedingung greifen Sie auch hier gegebenenfalls im Schleifenkörper mit continue, break oder exit steuernd ein.

Dieser Schleifentyp führt im Gegensatz zur For-Schleife keine Daten zu. Ein Minimalbeispiel zeigen Listing 5 und die zugehörige Abbildung 4. Die Schleife läuft solange, bis die Variable $k den Wert 5 erreicht. Anhand der kleinen Demonstration sehen Sie auch, dass Sie hier selbst für die Wertzuweisung an inkrementierende Variablen sorgen müssen.

Listing 5

#!/bin/bash
k=0
while [ $k -lt 5 ]; do
  k=$(echo $k + 1 | bc)
  for (( j=0; j<$k; j++ )); do
    echo -n "."
  done
  echo $k
done
Abbildung 4: Der Ablauf der While-Schleife aus Listing 5.
Abbildung 4: Der Ablauf der While-Schleife aus Listing 5.

Die Until-Schleife unterscheidet sich vom While-Gegenstück nur dadurch, dass sie solange läuft, bis die im Kopf angegebene Bedingung erfüllt ist (Listing 6).

Listing 6

#!/bin/sh
k=0
until [ $k -eq 5 ]; do
  k=$(echo $k + 1 | bc)
  echo $k
done

Endlosschleifen

Benötigen Sie von vornherein eine Endlosschleife, die aus dem Schleifenkörper heraus gesteuert wird, setzen Sie mit while die Bedingung true ein, mit until als Gegenstück false. Die beiden Hilfsprogramme ersetzen die einleitende Bedingung und geben nur einen Exitcode aus: true 0 und false 1.

Endlosschleifen setzen Sie beispielsweise in Menüsteuerungen oder für Überwachungsaufgaben ein. Das Listing 7 zeigt Ihnen den Einsatz in beiden Schleifentypen. Im Vorgriff zu den folgenden Punkten der Schleifensteuerung finden Sie auch bereits break und exit im Einsatz.

Listing 7

$$nonumber
#!/bin/sh
echo "While-Schleife"
k=0
while true; do
  k=$(echo $k + 1 | bc)
  echo $k
  # Schleifendurchlauf
  # mit 'break' beenden
  if [ $k -eq 5 ]; then
    break
  fi
done
echo "Until-Schleife"
k=0
until false; do
  k=$(echo $k + 1 | bc)
  echo $k
  # Schleife und Programm
  # beenden mit 'exit'
  if [ $k -eq 5 ]; then
    exit
  fi
done

Stop and go

Eine Schleife brechen Sie bei Bedarf mittels break ab, wie das While-Beispiel in Listing 7 demonstriert. In verschachtelten Schleifen dürfen Sie mehrere Ebenen überspringen, indem Sie zusätzlich die Ebenenzahl angeben.

Um nicht nur die Schleifenausführung abzubrechen, sondern das gesamte Skript, greifen Sie zu exit, wie im Until-Beispiel aus Listing 7. Optional geben Sie dem Befehl noch einen numerischen Exit-Code mit auf den Weg (exit 3), den Sie dann auf der Kommandozeile auswerten können. Zur Erinnerung: Den Exit-Code fragen Sie unmittelbar nach dem Kommando durch echo $? ab.

Der Befehl continue springt ohne Abarbeiten eventueller weiterer Befehle ans Schleifenende und startet einen neuen Schleifendurchlauf. Innerhalb verschachtelter Schleifen dürfen Sie wiederum durch mehrere Ebenen wechseln, indem Sie die Zahl der Ebenensprünge angeben. Die Zählung (eigene Schleife) beginnt dabei mit 1. Ohne diese Angabe wirkt continue stets in der aktuellen Schleife.

Schleifenkörper

Das Skript aus Listing 8 soll dreimal innerhalb verschachtelter Schleifen zählen. Eine Bedingung in der Hauptschleife löst per exit-Befehl das Skriptende aus. In der untersten Ebene unterbricht ein continue den Schleifendurchlauf und springt zur „Hauptschleife“. Diese läuft anschließend weiter und zählt dann bis zur Abbruchbedingung weiter (Abbildung 5).

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 7 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
KAUFEN
LinuxUser 06/2015 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: