Bash: Dateien und Verzeichnisse mit Test-Operatoren prüfen
August 27, 2017
Beim Schreiben von Bash-Skripten ist es häufig notwendig, den Zustand von Dateien oder Verzeichnissen zu überprüfen, bevor eine Operation ausgeführt wird. Existiert eine Datei? Ist sie leer? Handelt es sich um ein Verzeichnis? Für diese Aufgaben stellt Bash eine Reihe von Test-Operatoren zur Verfügung, die innerhalb von if-Bedingungen oder dem test ([ ]) Befehl verwendet werden.
Wichtige File Test Operatoren
| Operator | Beschreibung |
|---|---|
-e file | Existiert: Wahr, wenn file existiert. |
-f file | Reguläre Datei: Wahr, wenn file eine reguläre Datei ist. |
-d dir | Verzeichnis: Wahr, wenn dir ein Verzeichnis ist. |
- |
-L file| Symbolischer Link: Wahr, wennfileein Symlink ist. | |-s file| Nicht leer: Wahr, wennfileexistiert und größer als null ist. | |-r file| Lesbar: Wahr, wennfileexistiert und lesbar ist. | |-w file| Schreibbar: Wahr, wennfileexistiert und schreibbar ist. | |-x file| Ausführbar: Wahr, wennfileexistiert und ausführbar ist. |
Anwendungsbeispiele
Wichtiger Hinweis: Variablen, die Pfade enthalten, sollten immer in doppelten Anführungszeichen ("$path") verwendet werden, um Probleme mit Leerzeichen oder Sonderzeichen im Dateinamen zu vermeiden.
Beispiel 1: Überprüfen, ob eine Datei existiert
#!/usr/bin/env bash
CONFIG_FILE="/etc/my_app/config.conf"
if [ -e "$CONFIG_FILE" ]; then
echo "Konfigurationsdatei gefunden: $CONFIG_FILE"
else
echo "Fehler: Konfigurationsdatei nicht gefunden." >&2
exit 1
fi
Beispiel 2: Sicherstellen, dass ein Verzeichnis existiert
Dieses Muster stellt sicher, dass ein Verzeichnis existiert, und erstellt es, falls nicht.
#!/usr/bin/env bash
LOG_DIR="/var/log/my_app"
# Das '!' negiert die Bedingung
if [ ! -d "$LOG_DIR" ]; then
echo "Log-Verzeichnis '$LOG_DIR' wird erstellt..."
# 'mkdir -p' erstellt auch übergeordnete Verzeichnisse und gibt keinen Fehler aus, wenn es bereits existiert.
mkdir -p "$LOG_DIR"
fi
Beispiel 3: Datei lesen, nur wenn sie nicht leer ist
#!/usr/bin/env bash
INPUT_FILE="data.csv"
if [ -s "$INPUT_FILE" ]; then
echo "Verarbeite Inhalt von '$INPUT_FILE'..."
while read -r line; do
# ... Logik zur Verarbeitung der Zeile ...
done < "$INPUT_FILE"
else
echo "Warnung: Eingabedatei '$INPUT_FILE' ist leer oder existiert nicht."
fi
Fazit
File Test Operatoren sind ein fundamentaler Bestandteil robuster Bash-Skripte. Sie ermöglichen es, Vorbedingungen zu prüfen und Fehler elegant abzufangen, bevor sie zu Laufzeitproblemen führen. Die konsequente Verwendung von Anführungszeichen um Variablen ist dabei entscheidend für die Stabilität Ihrer Skripte.