Bedingte Logik mit If-Else

ShellBeginner
Jetzt üben

Einführung

Stellen Sie sich vor, Sie fahren mit einem GPS-Navigationsgerät Auto. Das GPS gibt Ihnen nicht einfach nur eine feste Liste von Anweisungen. Es reagiert auf die Straße. Wenn es Stau gibt, berechnet es eine neue Route. Wenn Sie eine Abbiegung verpassen, berechnet es den Weg neu.

In Skripten nennen wir das bedingte Logik. Ohne sie wäre ein Skript nur eine blinde Liste von Befehlen. Mit bedingter Logik kann das Skript die aktuelle Situation prüfen und entscheiden, was als Nächstes geschehen soll.

Das ist eine der Grundlagen zuverlässiger Automatisierung. Reale Systeme befinden sich nicht immer im gleichen Zustand. Gute Skripte müssen deshalb reagieren, statt bestimmte Zustände einfach vorauszusetzen.

In diesem Lab geben Sie Ihren Skripten mit if und else ein „Gehirn“.

Sie bringen Ihrem Skript bei:

  1. Die Realität zu prüfen: Es soll feststellen, ob eine Datei tatsächlich existiert, bevor es versucht, sie zu öffnen.
  2. Entscheidungen zu treffen: Bei „Ja“ soll es eine Aktion ausführen, bei „Nein“ eine andere.
  3. Die ID zu prüfen: Es soll überprüfen, ob der Benutzer über die erforderlichen Berechtigungen (Root) zum Ausführen des Skripts verfügt.

Prüfen, ob eine Datei existiert

Ein gutes Skript handelt wie ein vorsichtiger Fahrer: Es schaut zuerst, bevor es handelt. Eine der häufigsten Prüfungen unter Linux lautet: „Existiert diese Datei?“

Dafür verwenden wir das Flag -f (Dateiprüfung) innerhalb eines if-Blocks. Stellen Sie sich if als einen Sicherheitsdienst vor. Der Code innerhalb des Blocks wird nur ausgeführt, wenn die Bedingung erfüllt ist.

Dies ist Ihr erstes echtes Beispiel für ein Skript, das anhand des Systemzustands eine Entscheidung trifft. Damit machen Sie einen wichtigen Schritt weg von „Befehle der Reihe nach ausführen“ hin zu „die Umgebung prüfen und anschließend eine Aktion auswählen“. Ein großer Teil der Administrationsskripte basiert genau auf diesem Muster.

Wechseln Sie zunächst in Ihren Projektordner:

cd ~/project

Erstellen Sie ein neues Skript mit dem Namen check_file.sh:

nano check_file.sh

Geben Sie den folgenden Code ein. Damit prüfen Sie, ob data.txt existiert.

#!/bin/bash

FILE="data.txt"

if [ -f "$FILE" ]; then
  echo "$FILE exists."
fi

Die Logik im Detail:

  • if [ ... ]; then: Das ist die Prüfung. Sie stellt innerhalb der eckigen Klammern eine Frage.
  • -f "$FILE": Die Frage lautet: „Ist data.txt eine echte Datei?“
  • echo ...: Das ist die Aktion. Sie wird nur ausgeführt, wenn die Prüfung „Ja“ ergibt.
  • fi: Bedeutet „If beenden“. Damit teilen Sie Linux mit, dass der bedingte Abschnitt zu Ende ist.

Die Schreibweise mit [ ... ] ist die in Bash übliche Form, um einen Test auszuführen. In diesem Fall wird eine Dateieigenschaft geprüft. Linux und Bash stellen viele solcher Testoperatoren bereit. Wenn Sie diese beherrschen, können Skripte Dateien, Zeichenketten, Zahlen und Berechtigungen auswerten.

Speichern Sie die Datei mit Ctrl+O und beenden Sie nano mit Ctrl+X.

Machen Sie das Skript ausführbar:

chmod +x check_file.sh

Test 1: Die unsichtbare Datei

Führen Sie das Skript jetzt aus:

./check_file.sh

Es passiert nichts. Es wird keine Ausgabe angezeigt.

Warum? data.txt existiert nicht. Die Prüfung hat „Nein“ ergeben, deshalb wurde der Befehl echo vollständig übersprungen.

Test 2: Die sichtbare Datei

Erstellen Sie nun die Datei:

touch data.txt

Führen Sie das Skript erneut aus:

./check_file.sh

Jetzt ergibt die Prüfung „Ja“, und Sie sehen:

data.txt exists.

Einen Else-Block hinzufügen

Keine Ausgabe ist verwirrend. Wenn ein Skript nichts tut, wissen Sie nicht, ob es fehlgeschlagen ist oder einfach beendet wurde. Wir brauchen einen Plan B.

In der Logik ist das eine „Weggabelung“.

  • Pfad A (if): Die Datei existiert. Alles ist in Ordnung.
  • Pfad B (else): Die Datei fehlt. Wir beheben das.

Ändern Sie das Skript so, dass es die fehlende Datei automatisch erstellt.

Löschen Sie zunächst die Testdatei, damit Sie eine echte Prüfung durchführen:

rm data.txt

Öffnen Sie Ihr Skript:

nano check_file.sh

Fügen Sie den else-Block wie unten gezeigt hinzu:

#!/bin/bash

FILE="data.txt"

if [ -f "$FILE" ]; then
  echo "$FILE exists."
else
  echo "$FILE does not exist. Creating it now..."
  touch "$FILE"
fi

Die Logik:

Wenn if den Wert True ergibt, wird der erste Teil ausgeführt.

Wenn if den Wert False ergibt, wird der else-Teil ausgeführt.

Ein solches Skript entspricht häufig eher der Praxis im Betrieb als ein Skript, das nur Informationen ausgibt. Statt lediglich zu melden, dass etwas fehlt, behebt es die Situation. Deshalb bildet bedingte Logik die Grundlage vieler Einrichtungs- und Wartungsskripte.

Speichern Sie die Datei und beenden Sie nano.

Die Logik testen

Führen Sie das Skript aus. data.txt fehlt, daher sollte es Pfad B wählen:

./check_file.sh

Ausgabe:

data.txt does not exist. Creating it now...

Führen Sie das Skript sofort noch einmal aus. Jetzt ist data.txt vorhanden, daher sollte es Pfad A wählen:

./check_file.sh

Ausgabe:

data.txt exists.

Ihr Skript ist jetzt „idempotent“. Das bedeutet: Sie können es 100-mal ausführen, und es stellt jedes Mal sicher, dass das gewünschte Ergebnis vorliegt – die Datei existiert –, ohne abzustürzen.

Dieser Begriff wird in DevOps häufig verwendet. Eine idempotente Aktion kann sicher wiederholt werden, weil der Endzustand wichtiger ist als die Anzahl der Ausführungen. Dadurch wird Automatisierung zuverlässiger, besonders wenn Aufträge erneut ausgeführt werden.

Root-Berechtigungen prüfen

Unter Linux sind manche Türen verschlossen. Nur der Superuser (Root) besitzt den Schlüssel. Wenn Sie ein Skript zur Systemwartung als normaler Benutzer ausführen, schlägt es mit „Permission Denied“ fehl.

Ein intelligentes Skript prüft Ihre Benutzer-ID, bevor es versucht, die Tür zu öffnen.

Unter Linux hat jeder Benutzer eine Nummer, die UID.

  • Root hat immer die UID 0.
  • Normale Benutzer haben normalerweise eine UID ab 1000.

Schreiben Sie ein Skript, das Ihre Benutzer-ID prüft.

Erstellen Sie check_root.sh:

nano check_root.sh

Geben Sie den folgenden Code ein:

#!/bin/bash

if [ "$UID" -eq 0 ]; then
  echo "You are running this script as root."
else
  echo "You are running this script as a regular user."
fi

Die Prüfung im Detail:

  • $UID: Die Variable enthält Ihre aktuelle Benutzer-ID.
  • -eq: Bedeutet „gleich“. Für Zahlen verwenden wir -eq, für Wörter =.

Dies ist ein weiteres Beispiel für die Syntax von Tests. Beim Vergleichen von Zahlen innerhalb von [ ... ] verwendet Bash Operatoren wie -eq, -ne, -lt und -gt. Diese unterscheiden sich von Vergleichen von Zeichenketten, weil die Shell wissen muss, ob sie Wörter oder numerische Werte vergleicht.

Speichern Sie die Datei und beenden Sie nano. Machen Sie das Skript ausführbar:

chmod +x check_root.sh

Der Test

Da Sie als labex angemeldet sind, sind Sie ein normaler Benutzer.

Führen Sie das Skript normal aus:

./check_root.sh

Das Skript erkennt Ihre ID ungleich 0 und gibt Folgendes aus:

You are running this script as a regular user.

Leihen wir uns nun mit sudo den Umhang des Superusers:

sudo ./check_root.sh

sudo setzt Ihre ID nur für diesen einen Befehl auf 0. Das Skript erkennt dies und antwortet:

You are running this script as root.

So funktionieren professionelle Installationsskripte: Sie verweigern die Ausführung, wenn Sie nicht als Root handeln.

Das Ziel ist nicht, für jede Aufgabe Root-Berechtigungen zu verlangen. Stattdessen soll das Skript die Berechtigungen prüfen, bevor es geschützte Aktionen ausführt. Ein gut geschriebenes Skript bricht frühzeitig mit einer verständlichen Erklärung ab, statt nur teilweise zu laufen und später schwer verständliche Berechtigungsfehler zu erzeugen.

Zusammenfassung

Sie haben Ihren Skripten gerade ein Gehirn gegeben.

In diesem Lab haben Sie gelernt:

  1. Die Prüfung (if): Fragen zu stellen wie „Existiert diese Datei?“ (-f).
  2. Die Weggabelung (else): Einen alternativen Plan bereitzustellen, wenn die Antwort „Nein“ lautet.
  3. Die ID-Prüfung: Mit einem Zahlenvergleich (-eq) die Benutzerberechtigungen zu überprüfen.

Ihre Skripte sind jetzt keine einfachen Befehlslisten mehr. Es sind intelligente Programme, die sich an ihre Umgebung anpassen.