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 immerlsvorab 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 |