TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

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

OperatorBeschreibung
-e fileExistiert: Wahr, wenn file existiert.
-f fileReguläre Datei: Wahr, wenn file eine reguläre Datei ist.
-d dirVerzeichnis: Wahr, wenn dir ein Verzeichnis ist.
  • | -L file | Symbolischer Link: Wahr, wenn file ein Symlink ist. | | -s file | Nicht leer: Wahr, wenn file existiert und größer als null ist. | | -r file | Lesbar: Wahr, wenn file existiert und lesbar ist. | | -w file | Schreibbar: Wahr, wenn file existiert und schreibbar ist. | | -x file | Ausführbar: Wahr, wenn file existiert 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

code
#!/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.

code
#!/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

code
#!/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.