linux-cli-shell automation bash scripting fundamentals

Bash Scripting: Variables & Control Flow (Artikel 241)

Grundlagen der Bash-Programmierung für Systemadministratoren. Erfahren Sie den sicheren Umgang mit Variablen, logischen Operatoren und Kontrollstrukturen für die tägliche Automatisierung.

# Bash Scripting: Das Fundament der Automatisierung

TL;DR / Management Summary Jede komplexe Automatisierung unter Linux beginnt mit einem Bash-Skript. Wer Variablen sicher nutzt, logische Operatoren versteht und Kontrollstrukturen (if, for, while) beherrscht, verwandelt manuelle, fehleranfällige Aufgaben in präzise Werkzeuge. In diesem Modul lernen wir die Bausteine der Bash-Programmierung kennen – mit Fokus auf sauberem Code und Fehlervermeidung.


# 1. Einführung & Architektur

Die Shell als Programmiersprache.

Bash ist kein Compiler, sondern ein Interpreter. Das Skript wird Zeile für Zeile gelesen und ausgeführt.

# Der Skript-Fluss (Mermaid)

graph TD
    A[Shebang: #!/bin/bash] --> B[Initialization: Variables]
    B --> C{Logic Check: if/then}
    C -->|True| D[Action A]
    C -->|False| E[Action B]
    D/E --> F[Iteration: for/while loops]
    F --> G[Exit Code: 0 or 1]

# 2. Variablen und Datentypen

Werte speichern.

In Bash gibt es keine harten Datentypen. Alles wird als String behandelt, kann aber numerisch ausgewertet werden.

# Zuweisung und Abruf

NAME="Server01"
MEMORY_GB=16

# WICHTIG: Quotes nutzen um Leerzeichen-Fehler zu vermeiden
echo "Starting update on ${NAME}..."

# 3. Logische Operatoren

Entscheidungen treffen.

Nutzen Sie immer die moderne Syntax [[ ]] für Vergleiche.

# Zahlenvergleich

  • -eq: Equal (Gleich)
  • -ne: Not Equal (Ungleich)
  • -lt: Less Than (Kleiner als)
  • -gt: Greater Than (Größer als)

# Stringvergleich

  • ==: Gleich
  • !=: Ungleich
  • -z: String ist leer
if [[ $MEMORY_GB -gt 8 ]]; then
    echo "High memory system detected."
fi

# 4. Kontrollstrukturen

Den Ablauf steuern.

# For-Loops (Listen abarbeiten)

SERVERS=("web01" "web02" "db01")
for S in "${SERVERS[@]}"; do
    ssh "$S" "uptime"
done

# While-Loops (Warten auf Bedingung)

# Warte bis Port 80 erreichbar ist
while ! nc -z localhost 80; do
  echo "Waiting for Nginx..."
  sleep 1
done

# 5. Troubleshooting & “War Stories”

Bugs in der Logik.

# Story 1: “Die verschwundene Null”

Symptom: Ein Skript vergleicht [[ $VAR -eq 0 ]], bricht aber mit einem Fehler ab, wenn $VAR leer ist. Ursache: Bash ersetzt die Variable vor der Ausführung. [[ -eq 0 ]] ist ungültige Syntax. Lösung: Nutzen Sie Standardwerte: [[ ${VAR:-0} -eq 0 ]]. Wenn $VAR leer ist, wird 0 eingesetzt.

# Story 2: “Global vs. Local”

Symptom: Eine Variable ändert plötzlich ihren Wert, obwohl sie in einer Funktion gar nicht angefasst wurde. Ursache: Variablen sind in Bash standardmäßig global. Wenn zwei Funktionen den Namen i nutzen, überschreiben sie sich gegenseitig. Lösung: Nutzen Sie immer das Schlüsselwort local innerhalb von Funktionen: local i=0.


# 6. Fazit & Empfehlung

  • Zitate: Setzen Sie Variablen immer in doppelte Anführungszeichen: "$VAR".
  • Lesbarkeit: Nutzen Sie Einrückungen (2 oder 4 Leerzeichen). Ein unlesbares Skript wird nicht gewartet.
  • Safety: Starten Sie jedes Skript mit set -euo pipefail (siehe Artikel 049).

# Anhang: Cheatsheet

Aufgabe Syntax
Variable setzen VAR="Value"
Variable lesen ${VAR}
Befehlsergebnis RESULT=$(ls)
Wenn / Dann if [[ condition ]]; then ... fi
Fallunterscheidung case $VAR in ... esac
Arithmetik (( SUM = 1 + 1 ))
Argumente $1, $2, $@ (Erster, zweiter, alle)
Rückgabewert $? (0 = Erfolg)