if then else shell script

if then else shell script

Wer jemals vor einem schwarzen Terminal saß und verzweifelt versuchte, eine Logik in Bash abzubilden, kennt den Frust. Ein falsch gesetztes Leerzeichen oder eine vergessene Klammer reicht aus, damit das ganze System steht. Das Beherrschen von einem If Then Else Shell Script ist keine bloße Fleißaufgabe für Informatikstudenten, sondern das Fundament für jede ernsthafte Automatisierung unter Linux oder macOS. Ohne diese Verzweigungen bleibt dein Code starr. Er kann nicht auf Fehler reagieren. Er kann nicht prüfen, ob eine Datei existiert oder ob der Speicherplatz auf dem Server knapp wird. Ich habe über die Jahre hunderte Skripte gesehen, die genau an diesen Grundlagen zerbrochen sind.

Es geht hier nicht um graue Theorie aus alten Lehrbüchern. Wir schauen uns an, wie du Logik baust, die im produktiven Einsatz besteht. Die Suchintention hinter diesem Thema ist klar: Du willst wissen, wie man Bedingungen korrekt prüft, Fehler vermeidet und sauberen Code schreibt. Viele scheitern schon an der Syntax der eckigen Klammern. Andere wissen nicht, wann sie einfache oder doppelte Klammern nutzen sollen. Wir klären das jetzt.

Die harte Wahrheit über Bedingungen in der Shell

In der Welt von Linux ist fast alles ein Rückgabewert. Wenn du einen Befehl ausführst, hinterlässt er eine Zahl zwischen 0 und 255. Die Null bedeutet Erfolg. Alles andere ist ein Fehler. Das ist die Basis für jede Entscheidung in deinem Code. Die Logik prüft eigentlich nur, ob der letzte Befehl glücklich war.

Wenn du eine Datei suchst, nutzt du oft den test-Befehl. Die meisten kennen ihn nur in Form der eckigen Klammern [ ]. Das ist eigentlich nur ein Alias für /usr/bin/test. Es ist ein eigenständiges Programm. Das ist der Grund, warum Leerzeichen in der Shell so verdammt wichtig sind. Schreibe ich [1 -eq 1], knallt es. Die Shell denkt dann, [1 sei der Name eines Programms. Korrekt ist nur [ 1 -eq 1 ]. Jedes Zeichen zählt.

Warum einfache Klammern oft in die Irre führen

Die klassischen eckigen Klammern sind alt. Sie stammen aus der Zeit der originalen Bourne Shell. Sie funktionieren fast überall, haben aber Tücken. Sie können zum Beispiel nicht direkt mit logischen Operatoren wie && oder || umgehen, ohne dass man sie kompliziert verschachtelt. Wer heute moderne Systeme wie Debian, Ubuntu oder Red Hat nutzt, sollte meistens auf die doppelten eckigen Klammern [[ ]] setzen. Diese sind ein eingebautes Feature der Bash. Sie sind schneller. Sie sind sicherer. Sie erlauben Mustervergleiche mit Wildcards. Wer noch die alten Klammern nutzt, quält sich meistens selbst ohne Grund.

Der Exit Status als unsichtbarer Helfer

Jedes Mal, wenn du eine Bedingung schreibst, fragt das System im Hintergrund die Variable $? ab. Du kannst das selbst ausprobieren. Tippe ls in dein Terminal und danach echo $?. Da steht eine Null. Tippe einen Befehl ein, den es nicht gibt, und du siehst eine 127. Dein Programm macht nichts anderes als diese Zahlen zu interpretieren. Das ist wichtig zu verstehen, weil du so auch eigene Funktionen bauen kannst, die wie eine Bedingung fungieren. Eine Funktion, die mit return 1 endet, wird von der Logik als "falsch" gewertet.

Das Design von einem If Then Else Shell Script

Die Struktur muss sitzen. Wenn du ein If Then Else Shell Script schreibst, ist die Lesbarkeit dein bester Freund. Ein typischer Fehler ist das Weglassen von then in einer neuen Zeile oder das Vergessen des Semikolons.

Hier ist ein reales Beispiel für eine einfache Prüfung. Stell dir vor, du willst prüfen, ob ein Backup-Verzeichnis existiert:

VERZEICHNIS="/mnt/backup"
if [ -d "$VERZEICHNIS" ]; then
    echo "Ordner ist da. Starte Kopierorgie."
else
    echo "Fehler: Backup-Ziel fehlt!"
    exit 1
fi

Das sieht simpel aus. Aber achte auf die Anführungszeichen um die Variable. Wenn der Pfad Leerzeichen enthält und du die Anführungszeichen vergisst, bricht das Skript ab. Das ist ein klassischer Anfängerfehler, den man auch bei Profis noch sieht, wenn sie unter Zeitdruck stehen.

Die Verschachtelung mit Elif

Oft reicht ein Entweder-oder nicht aus. Du brauchst mehr Optionen. Dafür gibt es elif. Das ist die Kurzform für "else if". Denk an eine Speicherplatzprüfung. Du willst warnen, wenn 80% voll sind, und panisch schreien, wenn 95% erreicht sind.

  1. Prüfe die kritische Schwelle (95%).
  2. Wenn nicht kritisch, prüfe die Warnschwelle (80%).
  3. Wenn alles okay ist, gib eine Erfolgsmeldung aus.

In der Praxis sieht das oft so aus, dass man die spezifischsten Bedingungen zuerst prüft. Wenn du mit der allgemeinsten Bedingung anfängst, werden die kritischen Fälle vielleicht nie erreicht, weil die Logik schon vorher abbiegt.

Logische Verknüpfungen für Profis

Manchmal müssen zwei Dinge gleichzeitig wahr sein. Du willst nur löschen, wenn die Datei älter als 30 Tage IST UND das Backup erfolgreich war. Mit den modernen doppelten Klammern schreibst du einfach [[ $alter -gt 30 && $backup_status == "ok" ]]. Das ist sauber. Es ist lesbar. Es verhindert Fehler bei der Auswertung von Variablen, die leer sein könnten.

Typische Stolperfallen in der Praxis

Ich habe oft erlebt, dass Leute versuchen, Zeichenketten wie Zahlen zu vergleichen. Das ist in der Shell tödlich. Für Zahlen nutzt du Operatoren wie -eq (equal), -ne (not equal), -lt (less than) oder -gt (greater than). Für Texte nutzt du = oder !=.

💡 Das könnte Sie interessieren: e scooter b ware mit straßenzulassung

Wenn du schreibst [ "5" = "5" ], vergleicht die Shell die Zeichen "5" und "5". Das funktioniert meistens. Aber wehe, du willst wissen, ob 10 größer als 2 ist. Als Text sortiert kommt die 1 vor der 2. Also wäre "10" kleiner als "2". Das willst du nicht. Nutze für Zahlen immer die numerischen Operatoren. Ein Blick in die Manpage von test hilft hier Wunder. Du findest sie online auf Portalen wie die.net, einer verlässlichen Quelle für Linux-Dokumentation.

Die Gefahr leerer Variablen

Stell dir vor, du prüfst eine Variable, die durch eine Benutzereingabe gefüllt wird. Der Benutzer drückt einfach Enter. Die Variable ist leer. Dein Code sieht dann so aus: if [ = "ja" ]. Das gibt einen Syntaxfehler. Die Shell sieht den Vergleichsoperator, aber davor steht nichts. Deshalb setzen erfahrene Admins Variablen immer in doppelte Anführungszeichen. Dann sieht die Shell if [ "" = "ja" ]. Das ist gültiges Bash-Deutsch und führt nicht zum Absturz.

Das Semikolon-Rätsel

Viele fragen sich, warum man manchmal ein Semikolon vor das then setzt. Das ist nur nötig, wenn then in derselben Zeile wie das if steht. Die Shell beendet Befehle normalerweise durch einen Zeilenumbruch. Wenn du alles in eine Zeile quetschen willst, musst du das Ende des if-Befehls manuell markieren. Ich rate davon ab. Es macht den Code hässlich. Schreib es lieber untereinander. Das spart Nerven beim Debuggen um drei Uhr morgens.

Fortgeschrittene Techniken für sauberen Code

Ein If Then Else Shell Script kann schnell unübersichtlich werden, wenn du zu viele Bedingungen ineinander schachtelst. Man nennt das den "Callback-Hell" der Shell. Wenn du bei der fünften Einrückungsebene angekommen bist, versteht niemand mehr, was passiert.

Case-Statements als Alternative

Wenn du eine Variable gegen fünf verschiedene Werte prüfen willst, nimm kein langes Monster aus if und elif. Nutze case. Das ist wie ein Auswahlmenü. Es ist viel übersichtlicher. Du kannst Muster definieren und sogar Standardwerte festlegen, falls keine Option passt. Das spart massiv Zeilen und macht die Logik klarer.

Der Einzeiler-Trick

Manchmal ist ein ganzer Block zu viel. Wenn du nur eine kurze Aktion ausführen willst, falls ein Befehl scheitert, nutze die Logik-Operatoren der Shell direkt. mkdir /tmp/test || exit 1. Das bedeutet: Erstelle den Ordner ODER (falls das schiefgeht) beende das Skript. Das ist im Grunde ein mini If-Statement ohne den ganzen Ballast. Es ist effizient. Aber Vorsicht: Nutze das nur für sehr einfache Fälle. Sobald Logik komplexer wird, gehört sie in eine ordentliche Struktur.

Arithmetische Ausdrücke

Für mathematische Vergleiche gibt es in der Bash die doppelten runden Klammern (( )). Hier kannst du fast wie in C oder Java schreiben. if (( x > 10 )); then. Das ist intuitiver für Leute, die von anderen Sprachen kommen. Es erlaubt sogar kleine Rechnungen direkt in der Bedingung. Wer viel mit Zählern oder Statistiken arbeitet, wird diese Syntax lieben.

Warum Fehlerbehandlung keine Option ist

In der IT geht schief, was schiefgehen kann. Ein Skript, das blind Befehle abfeuert, ist eine Gefahr für die Infrastruktur. Jedes Mal, wenn du eine Datei verschiebst, löschst oder änderst, musst du prüfen, ob der Schritt davor erfolgreich war.

Ein guter Ansatz ist das "Fail Early"-Prinzip. Wenn eine wichtige Voraussetzung nicht erfüllt ist, brich sofort ab. Warte nicht, bis der Fehler Folgeschäden verursacht. Ein Skript sollte am Anfang prüfen, ob es die nötigen Rechte hat (bist du Root?) und ob alle Tools installiert sind.

if [[ $EUID -ne 0 ]]; then
   echo "Dieses Skript muss als root ausgeführt werden"
   exit 1
fi

Solche Prüfungen machen den Unterschied zwischen einem Hobby-Bastler und einem Profi-Admin. Du kannst die Identität des Benutzers einfach über die Umgebungsvariablen prüfen. Informationen zu solchen Systemvariablen finden sich oft in den offiziellen Dokumentationen der Distributionen, wie zum Beispiel im Debian Wiki.

Performance und Effizienz

Man könnte meinen, bei einem kleinen Skript spielt die Geschwindigkeit keine Rolle. Aber was, wenn dein Code in einer Schleife tausendmal pro Minute aufgerufen wird? Der Aufruf von externen Programmen wie grep oder awk innerhalb einer Bedingung kostet Zeit. Jedes Mal muss ein neuer Prozess gestartet werden. Die Bash-internen Funktionen in den doppelten Klammern sind deutlich schneller. Sie bleiben im selben Speicherbereich.

String-Vergleiche optimieren

Wenn du prüfen willst, ob ein String mit einem bestimmten Wort beginnt, nutze die Pattern-Matching-Fähigkeiten der Bash. [[ $Variable == Start* ]]. Das ist rasend schnell. Du brauchst kein echo $Variable | grep ^Start. Vermeide Pipes, wo es nur geht. Pipes sind großartig für die Kommandozeile, aber in Skripten sind sie oft Leistungsfresser.

Den Code sauber halten

Kommentare sind kein Luxus. Schreib auf, WARUM du eine Bedingung prüfst. In sechs Monaten wirst du dich nicht mehr erinnern, warum du ausgerechnet auf den Fehlercode 12 prüfst. Ein kurzer Kommentar über dem Block rettet dir den Hintern. Nutze aussagekräftige Variablennamen. $USER_INPUT ist besser als $var1. Das klingt banal, wird aber ständig ignoriert.

Was man von Profis lernen kann

Echte Experten nutzen oft Flags. Ein Flag ist eine Variable, die nur zwei Zustände kennt: 0 oder 1, wahr oder falsch. Du setzt am Anfang deiner Logik verschiedene Flags basierend auf komplexen Prüfungen. Später in deinem Programm nutzt du dann nur noch einfache Abfragen dieser Flags. Das entkoppelt die komplizierte Erkennung von der eigentlichen Aktion. Der Code wird dadurch modularer.

Ein weiterer Trick ist die Nutzung der trap-Funktion. Damit kannst du Aktionen definieren, die immer ausgeführt werden, wenn ein Skript beendet wird – egal ob durch einen Fehler oder einen regulären Abbruch. Das ist perfekt, um temporäre Dateien aufzuräumen, die dein Skript während der Laufzeit erstellt hat.

Die Rolle der Umgebung

Denk daran, dass deine Shell-Umgebung anders sein kann als die des Benutzers oder eines Cronjobs. Cronjobs haben oft einen sehr eingeschränkten PATH. Wenn dein Skript ein Programm aufruft, nutze entweder den vollen Pfad oder setze den PATH am Anfang des Skripts explizit. Viele Logik-Fehler entstehen nur deshalb, weil ein Befehl innerhalb der Bedingung nicht gefunden wurde und die Shell deshalb den "Else"-Zweig nimmt, obwohl eigentlich alles korrekt war.

Debugging leicht gemacht

Wenn gar nichts mehr geht, hilft set -x. Das schaltet den Trace-Modus ein. Die Shell schreibt dann jeden Befehl vor der Ausführung in das Terminal, inklusive der aufgelösten Variablen. Du siehst genau, an welcher Stelle deine Bedingung falsch abbiegt. Das ist das mächtigste Werkzeug in deinem Arsenal. Vergiss nicht, es wieder auszuschalten mit set +x, sobald du den Fehler gefunden hast, sonst wirst du von Text erschlagen.

Nächste Schritte für deinen Code

Theorie ist gut, aber jetzt musst du tippen. Wenn du deine Skripte auf das nächste Level heben willst, schau dir deine alten Werke an. Such nach Stellen, an denen du einfache Klammern genutzt hast und ersetze sie durch die sicherere Bash-Variante.

  1. Erstelle ein Test-Skript und experimentiere mit verschiedenen Exit-Codes.
  2. Baue eine Sicherheitsabfrage ein, die prüft, ob eine externe Webseite erreichbar ist, bevor ein Download startet. Nutze dafür curl -I und prüfe den Rückgabewert.
  3. Informiere dich über die Unterschiede zwischen der Bash und der POSIX-Shell, falls dein Code auf vielen verschiedenen Systemen (wie FreeBSD oder alten Solaris-Servern) laufen muss. Eine gute Anlaufstelle für Standards ist das Open Group Portal.
  4. Gewöhne dir an, Variablen immer zu quoten. Es erspart dir die Fehlersuche bei Pfaden mit Leerzeichen.
  5. Nutze Funktionen, um Logik-Blöcke wiederverwendbar zu machen. Ein guter Code liest sich am Ende wie eine Geschichte, nicht wie ein Buchstabensalat.

Wer diese Regeln befolgt, schreibt keine fragilen Skripte mehr. Du baust Werkzeuge, die funktionieren. Zuverlässig. Jeden Tag. Viel Erfolg beim Coden!

HH

Hannah Hartmann

Mit faktenbasierter Arbeitsweise liefert Hannah Hartmann Beiträge, die Leserinnen und Lesern Orientierung im Nachrichtengeschehen geben.