AA_123rf-18316704_alhovik-123RF.jpg

© alhovik, 123RF

Schleifen in der Shell

Kreislauf

Schleifen ermöglichen das mehrmalige Abarbeiten von Anweisungen. Dabei kann das begrenzende Ereignis sowohl außerhalb als auch innerhalb der Schleife liegen.

Mit Schleifen lassen Sie einen Teil eines Shellskripts solange immer wieder ausführen, bis eine beendende Bedingung eintritt – etwa für Menüsteuerungen, aber auch für die "richtige" Datenverarbeitung. Ohne Schleifen müssten Sie sonst das Skript immer wieder sich selbst starten lassen.

Eine Schleife leiten Sie mit einem der Schlüsselworte for, while oder until ein (Schleifenkopf). Dann folgt die Anweisung do, gefolgt von den Anweisungen, die innerhalb der Schleife ausgeführt werden sollen (Schleifenkörper). Ein abschließendes done beendet die Schleife.

Im Schleifenkörper bringen Sie neben den Arbeitsanweisungen auch steuernde Elemente für den Schleifenablauf unter. Das Kommando break beendet die Ausführung der Schleife und setzt das Skript mit den folgenden Anweisungen fort. Der Befehl continue bricht den aktuellen Durchlauf ab und startet einen neuen. Bei beiden Kommandos können Sie zusätzlich die Zahl der Ebenen angeben, die Sie bei verschachtelten Schleifen zurückspringen möchten. Soll das Skript die Ausführung eines anderen Programms abwarten, geschieht dies mittels wait; mit exit beenden Sie das Shellskript sofort und komplett.

For-Schleifen

Für die For-Schleife benötigen Sie "Datenfutter". Jeder Durchlauf erfolgt für genau einen Parameter, den die Shell einer Liste entnimmt, aus einem Inkrement berechnet oder aus einer anderen Datenquelle gewinnt. Grundsätzlich läuft die for-Schleife solange, wie sie entsprechende Daten vorfindet. Innerhalb des Schleifenkörpers können Sie gegebenenfalls mittels Ein- oder Mehrfachverzweigung (if, case) ein vorzeitiges Ende der Ausführung bestimmen.

Im einfachsten Fall geben Sie Parameter für den Schleifendurchlauf vor (Listing 1). Dabei kann es sich etwa um Dateien und Verzeichnisse, Benutzer, Anwendungen, Rechnernamen, IP-Adressen oder Ähnliches handeln. Listing 2 zeigt ein Minimalbeispiel dazu, in Abbildung 1 sehen Sie das Ergebnis.

Listing 1

for Variable in Parameter1, Parameter2 ...; do
  [... Anweisungen ...]
done

Listing 2

#!/bin/sh
for k in a  b  c; do
  echo $k
done
Abbildung 1: Eine For-Schleife mit festen Parametern.

Mittels der eingebauten Rechenkünste von Shells wie der Bash oder der Zsh können Sie ein Zählwerk schaffen, mit dem sich der Wert einer Variablen gleichmäßig erhöhen oder vermindern lässt. Nicht alle Shells stellen diese Funktion bereit, weswegen es hier sinnvoll ist, die gewünschte Shell innerhalb eines Shebang explizit anzugeben, beispielsweise mit #!/bin/bash statt des generischen #!/bin/sh, das die Standard-Systemshell aufruft.

Der Aufbau des rechnenden Schleifenkopfs beginnt mit der Definition des Ausgangswerts der Variablen. Es folgen eine Bedingung (Minimal/Maximalwert der Variablen) und die Anweisung der Erhöhung (Inkrement) respektive der Verminderung (Dekrement) des Werts. Einige Beispiele dazu finden Sie in Listing 3, die zugehörige Ausgabe zeigt Abbildung 2.

In den ersten beiden Schleifen beträgt der Inkrement- respektive Dekrementwert 1; die dritte Schleife zeigt die Berechnungsmethode für einen anderen, festen Erhöhungswert. In der letzten Schleife erhalten Sie durch die Multiplikation der Variable mit sich selbst ein quadratisches Inkrement. In diesem Fall darf der Startwert der Variable nicht 0 oder 1 betragen, weil Sie damit sonst eine Endlosschleife schaffen.

Listing 3

#!/bin/bash
echo "zunehmend"
for ((k=1; k<5; k++)); do
  echo $k
done
echo "abnehmend"
for ((k=4; k>0; k--)); do
  echo $k
done
echo "beliebiges Inkrement"
for (( k=10; k<50; k=k+10 )); do
  echo $k
done
echo "quadratisches Inkrement"
for (( k=2; k<300; k=k*k )); do
  echo $k
done
Abbildung 2: Der Ablauf des Skripts aus Listing 3.

Sie können die für den Lauf der For-Schleife notwendigen Parameter auch durch andere Anwendungen bereitstellen lassen. Der Aufruf erfolgt dann in folgender Form:

for Variable in $(Anwendung)

Hier dürfen Sie fast alles als Datenquelle nutzen, was eindeutige, durch Leerzeichen abgesetzte Werte produziert. Das Skript aus Listing 4 (den Ablauf zeigt Abbildung 3) bestimmt zunächst mithilfe von file den Typ aller mittels ls -1 im aktuellen Verzeichnis gefundenen Objekte. Das fold-Kommando dient dabei der Ausgabeformatierung.

Als zweites Beispiel sehen Sie das Auslesen einer Textdatei, die jeweils einen Namen pro Zeile aufweist. Je Durchlauf belegt das Skript die Variable k mit einem dieser Namen. Am Schluss liest es aus einer Datenbanktabelle die als Schlüssel fungierende orgnr für alle Zahlen kleiner 500 aus. Die Datenbanktabelle weist nur drei Einträge auf, bei den Nummern 1 und 3 ist die gestellte Bedingung erfüllt. Das Beispiel begnügt sich mit der reinen Ausgabe des Zahlenwerts. In der Praxis setzen Sie hier eher umfangreiche Datenbankoperationen oder weitere Verarbeitungsschritte ein.

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.

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.

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

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 7 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Verschlungene Pfade
    Mit Schleifen, Fallunterscheidungen und Funktionen programmieren Sie komplexe Skripte auf einfache und elegante Weise.
  • Teil 5: Kontrollstrukturen die Zweite
    Nach der Einführung in die Kontrollstrukturen und Vorstellung von einfachen Vergleichsmöglichkeiten im letzten Teil beschäftigen wir uns diesmal mit Reihenvergleichen, Schleifen, Tastatureingaben und kleinen Auswahlmenüs.
  • Bash-Skripte sind Programme
    Wer regelmäßig mit der Shell arbeitet, wird leicht zum Programmierer: Schreiben Sie mehrere Shell-Befehle in eine Textdatei und machen diese ausführbar, haben Sie schon Ihr erstes Shell-Skript entwickelt. Die Shell bietet als Programmiersprache aber noch viel mehr.
  • Scripted Reality
    Aus den Shell-Tipps und dem Guru-Training kennen Sie viele nützliche Kommandozeilentools. Die können Sie in kleinen Shell-Skripten zu leistungsfähigen Miniprogrammen bündeln. Im einfachsten Fall lassen Sie damit mehrere Befehle automatisch nacheinander ablaufen, doch Skripte haben noch mehr zu bieten.
  • Erste Schritte mit Bash-Skripten
    Das Programmieren von Shell-Skripten ist keine Hexerei. Schon mit wenigen Grundkenntnissen sparen Sie durch das Automatisieren alltäglicher Aufgaben viel Zeit.
Kommentare

Infos zur Publikation

LU 11/2017: Server für Daheim

Digitale Ausgabe: Preis € 8,50
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Lieber Linux oder Windows- Betriebssystem?
Sina Kaul, 13.10.2017 16:17, 2 Antworten
Hallo, bis jetzt hatte ich immer nur mit
IT-Kurse
Alice Trader, 26.09.2017 11:35, 2 Antworten
Hallo liebe Community, ich brauche Hilfe und bin sehr verzweifelt. Ih bin noch sehr neu in eure...
Backup mit KUP unter Suse 42.3
Horst Schwarz, 24.09.2017 13:16, 3 Antworten
Ich möchte auch wieder unter Suse 42.3 mit Kup meine Backup durchführen. Eine Installationsmöglic...
kein foto, etc. upload möglich, wo liegt mein fehler?
kerstin brums, 17.09.2017 22:08, 5 Antworten
moin, zum erstellen einer einfachen wordpress website kann ich keine fotos uploaden. vom rechne...
Arch Linux Netzwerkkonfigurationen
Franziska Schley, 15.09.2017 18:04, 0 Antworten
Moin liebe Linux community, ich habe momentan Probleme mit der Einstellung des Lan/Wlan in Arc...