linux-cli-shell cli shell scripting expansion globbing productivity

Bash Expansion Mastery: Braces & Globs (Artikel 291)

Beherrschung der Bash-Expansionen zur massiven Steigerung der Effizienz. Erfahren Sie alles über Brace Expansion, intelligentes Globbing und komplexe Parameter-Substitution.

# Bash Expansion: Effizienz durch intelligente Platzhalter

TL;DR / Management Summary Wer jeden Dateipfad einzeln tippt, verschwendet Zeit. Bash-Expansionen erlauben es, komplexe Zeichenketten und Listen automatisch generieren zu lassen. Wir nutzen Brace Expansion ({}), um Ordnerstrukturen zu erstellen, Globbing (*, ?), um Dateien nach Mustern zu finden, und Arithmetic Expansion ($(( ))), um direkt in der Shell zu rechnen. Wer diese Techniken beherrscht, reduziert seine Tipparbeit um bis zu 80%.


# 1. Einführung & Architektur

Die Phasen der Expansion.

Bevor ein Befehl ausgeführt wird, durchläuft er den Bash-Parser. Dieser ersetzt Platzhalter durch echte Daten.

# Die Expansions-Reihenfolge (Mermaid)

graph TD
    A[Input: 'mkdir -p /data/{dev,prod}/log'] --> B[1. Brace Expansion]
    B -->|Result| C['mkdir -p /data/dev/log /data/prod/log']
    C --> D[2. Tilde Expansion: ~]
    D --> E[3. Parameter & Variable Expansion: $VAR]
    E --> F[4. Command Substitution: $]
    F --> G[5. Pathname Expansion: * ?]
    G --> H[Final Execution]

# 2. Brace Expansion: Listen generieren

Strukturen in einem Rutsch.

# Verzeichnisse erstellen

# Erstellt web, app, db jeweils in prod und dev
mkdir -p projects/{prod,dev}/{web,app,db}

# Zahlen- und Buchstabenreihen

# Backups für die letzten 10 Tage löschen (theoretisch)
echo backup_2023-10-{01..10}.tar.gz

# 3. Globbing: Intelligentes Filesystem-Matching

Finden statt suchen.

  • *: Beliebig viele Zeichen (auch Null).
  • ?: Exakt ein beliebiges Zeichen.
  • [abc]: Ein Zeichen aus der Menge.
  • [!abc]: Ein Zeichen, das nicht in der Menge ist.
# Zeige alle Log-Dateien, die mit 'error' beginnen und mit einer Zahl enden
ls -l /var/log/nginx/error.log.[0-9]

# 4. Day-2 Operations: Advanced Parameter Expansion

Logik beim Variablen-Abruf.

# Fallback-Werte

Verhindern Sie leere Variablen in kritischen Skripten.

# Nutze $1, falls leer nutze 'default_user'
USER="${1:-default_user}"

# Fehler bei fehlender Variable

# Skript bricht ab, wenn DB_HOST nicht gesetzt ist
: "${DB_HOST:?Variable DB_HOST muss gesetzt sein!}"

# 5. Troubleshooting & “War Stories”

Wenn die Expansion zu viel des Guten tut.

# Story 1: “Der RM-Unfall (Globbing Error)”

Symptom: Ein Admin will alle Dateien löschen, die mit einem Punkt beginnen (rm .*). Plötzlich ist auch der gesamte übergeordnete Ordner weg. Ursache: .* matcht in manchen Shells auch . (aktuelles Verzeichnis) und .. (Eltern-Verzeichnis). Lösung: Nutzen Sie spezifischere Muster wie .[!.]* (Punkt, gefolgt von einem Zeichen, das kein Punkt ist) oder nutzen Sie find.

# Story 2: “Expansion in Anführungszeichen”

Symptom: Ein Admin schreibt echo "Die Dateien sind: {a,b,c}". Der Output ist wörtlich {a,b,c}. Ursache: Brace Expansion funktioniert nicht innerhalb von doppelten Anführungszeichen. Lösung: Setzen Sie die Klammern außerhalb der Quotes: echo "Die Dateien sind: "{a,b,c}.


# 6. Fazit & Empfehlung

  • Produktivität: Nutzen Sie Braces {} für Backups: cp config.conf{,.bak}.
  • Sicherheit: Seien Sie vorsichtig mit Globs in Kombination mit rm. Nutzen Sie immer ls vorab mit dem gleichen Glob, um die Trefferliste zu sehen.
  • Wartung: Nutzen Sie in Skripten lieber die explizite Parameter-Expansion ${VAR}, um Missverständnisse mit umgebendem Text zu vermeiden.

# Anhang: Cheatsheet

Aufgabe Syntax Beispiel
Liste generieren {a,b} mkdir {test,prod}
Reihe generieren {start..end} {1..100}, {a..z}
Beliebige Zeichen * rm *.log
Ein Zeichen ? ls config.?
Zeichenklasse [a-z] ls [a-z]*.txt
Rechnen $(( )) echo $(( 5 * 10 ))
Default Wert ${VAR:-val} ${PORT:-80}
Error if unset ${VAR:?msg} Check mandatory vars
Substring ${VAR:0:5} Erste 5 Zeichen
Suchen/Ersetzen ${VAR/a/b} String-Manipulation