Bash-Entwicklung
Kernmuster und Best Practices für die Entwicklung von Bash 5.1+-Skripten. Bietet moderne Bash-Idiome, Fehlerbehandlung, Argumentparsung und reine Bash-Alternativen zu externen Befehlen.
Skriptgrundlage
Jedes Skript beginnt mit dem essentiellen Header:
#!/usr/bin/env bash
set -euo pipefail
Set-Optionen erklärt:
-e– Beende sofort bei Befehlsfehlern-u– Behandle nicht gesetzte Variablen als Fehler-o pipefail– Pipeline schlägt fehl, wenn ein Befehl fehlschlägt
Skript-Metadaten-Muster
SCRIPT_NAME=$(basename "${BASH_SOURCE[0]}")
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
readonly SCRIPT_VERSION="1.0.0"
readonly SCRIPT_NAME SCRIPT_DIR
Fehlerbehandlung
Implementiere eine trap-basierte Fehlerbehandlung für robuste Skripte.
Argumentparsung
Standardvorlage für die Argumentparsung.
Variablen-Best Practices
Verwende immer geschweifte Klammern und zitiere Variablen:
# Richtig
"${variable}"
"${array[@]}"
# Falsch
$variable
${array[*]} # Verwende [@] für korrekte Iteration
Verwende readonly für Konstanten:
readonly CONFIG_FILE="/etc/app/config"
readonly -a VALID_OPTIONS=("opt1" "opt2" "opt3")
Hinweis: Verwende readonly niemals in gesourcten Skripten – es verursacht Fehler beim erneuten Sourcen.
String-Operationen (Reines Bash)
Bevorzuge native Bash-Parametererweiterung gegenüber externen Tools:
# Leerzeichen abschneiden
trimmed="${string#"${string%%[![:space:]]*}"}"
trimmed="${trimmed%"${trimmed##*[![:space:]]}"}"
# Klein-/Großschreibung (Bash 4+)
lower="${string,,}"
upper="${string^^}"
# Teilstring extraktion
substring="${string:0:10}" # Erste 10 Zeichen
suffix="${string: -5}" # Letzte 5 Zeichen
# Muster ersetzen
replaced="${string//old/new}" # Alle ersetzen
replaced="${string/old/new}" # Erstes ersetzen
# Präfix/Suffix entfernen
no_prefix="${string#prefix}" # Kürzeste Übereinstimmung
no_prefix="${string##*/}" # Längste Übereinstimmung (Basename)
no_suffix="${string%suffix}" # Kürzeste Übereinstimmung
no_suffix="${string%%/*}" # Längste Übereinstimmung
Array-Operationen
# Deklaration
declare -a indexed_array=()
declare -A assoc_array=()
# Sichere Iteration mit nullglob
shopt -s nullglob
for file in *.txt; do
process "${file}"
done
shopt -u nullglob
# Array-Länge
length="${#array[@]}"
# Element anhängen
array+=("new_element")
# Mit Index iterieren
for i in "${!array[@]}"; do
printf '%d: %s\n' "${i}" "${array[i]}"
done
Dateioperationen
# Datei als String einlesen
content="$(<"${file}")"
# Datei in Array einlesen (Bash 4+)
mapfile -t lines < "${file}"
# Dateibedingungen prüfen
[[ -f "${file}" ]] # Normale Datei existiert
[[ -d "${dir}" ]] # Verzeichnis existiert
[[ -r "${file}" ]] # Lesbar
[[ -w "${file}" ]] # Schreibbar
[[ -x "${file}" ]] # Ausführbar
[[ -s "${file}" ]] # Nicht leer
# Sichere temporäre Datei erstellen
temp_file=$(mktemp)
trap 'rm -f "${temp_file}"' EXIT
Bedingte Ausdrücke
Verwende [[ ]] für Bedingungen (Bash-spezifisch, leistungsfähiger):
# String-Vergleiche
[[ "${var}" == "value" ]] # Gleichheit
[[ "${var}" == pattern* ]] # Glob-Übereinstimmung
[[ "${var}" =~ ^regex$ ]] # Regex-Übereinstimmung
# Numerische Vergleiche
(( num > 10 )) # Arithmetischer Vergleich
[[ "${num}" -gt 10 ]] # Traditionelle Syntax
# Zusammengesetzte Bedingungen
[[ -f "${file}" && -r "${file}" ]]
[[ "${opt}" == "a" || "${opt}" == "b" ]]
Hilfsfunktionen
Leistungsrichtlinien
- Verwende Built-ins anstelle externer Befehle, wenn möglich
- Führe Batch-Operationen statt Schleifen für große Datenmengen durch
- Verwende
printfanstelle vonechofür Portabilität und Kontrolle - Vermeide unnötige Subshells in engen Schleifen
- Verwende
[[ ]]anstelle von[ ]für String-Vergleiche
Zusätzliche Ressourcen
Referenzdateien
Für detaillierte Muster und Beispiele:
- bash_example_file.sh – Vollständige Skriptvorlage
- bash_example_includes.bash – Wiederverwendbare Hilfsfunktionen
- bash-agent-notes.md – Kontextabhängige Überprüfungsanleitung
- pure-bash-bible-strings.md – Muster für Zeichenkettenmanipulation
- pure-bash-bible-arrays.md – Array-Operationen
- pure-bash-bible-files.md – Muster für Dateibehandlung
- pure-bash-bible-variables.md – Referenz zur Parametererweiterung