Bash ist unglaublich flexibel und bietet verschiedene Optionen zum Testen von Dateien. Und wenn Sie nach einer Möglichkeit suchen, Ihre Dateien zu testen, werden Sie mit den Bash-Dateitestoperatoren weit kommen.
In diesem Tutorial lernen Sie verschiedene Dateitestoperatoren kennen und wie Sie sie verwenden können, um zu testen, ob eine Datei existiert, lesbar ist, leer ist usw.
Lesen Sie weiter und schließen Sie Freundschaft mit den Bash-Dateitestoperatoren!
Voraussetzungen
In diesem Tutorial wird eine praktische Demonstration durchgeführt. Wenn Sie mitmachen möchten, stellen Sie sicher, dass Sie Folgendes haben:
- A Linux system with Bash installed – This tutorial uses Ubuntu 20.04.
Die meisten Linux-Distributionen haben standardmäßig Bash installiert. Wenn Sie jedoch Windows verwenden, können Sie das Windows-Subsystem für Linux (WSL) installieren, um eine Bash-Shell zu erhalten.
- A user account with sudo privileges to run commands as root – This tutorial uses a root account for simplicity. But using a non-root user with sudo access is always recommended.
- In diesem Tutorial wird davon ausgegangen, dass Sie SSH-Zugriff auf Ihr Linux-System haben.
Was sind Bash-Dateitestoperatoren?
Bevor Sie sich mit den Testoperatoren beschäftigen, werfen Sie einen Blick darauf, wie sie funktionieren. Dateitestoperatoren ermöglichen es Ihnen, verschiedene Aspekte einer Datei zu testen, wie z.B., ob eine Datei existiert, lesbar/schreibbar ist, usw.
Die Verwendung von Dateitestoperatoren kann dazu beitragen, Fehler in Ihren Bash-Skripten zu verhindern. Der folgende Code ist eine Vorlage für die if-Anweisung. Die if-else-Anweisung ist ein leistungsstolles Werkzeug, das Sie oft in Bash-Skripten sehen werden.
Beachten Sie, dass die Teile des Codeblocks „then“ und „else“ optional sind. Sie können eine if-Anweisung auch ohne sie verwenden.
Überprüfung, ob eine Datei existiert
Sie haben einen Einblick in die Funktionsweise der Testoperatoren erhalten, aber das reicht nicht aus, um das genaue Verständnis ihrer Verwendung zu verbessern. Beginnen Sie also mit einem grundlegenden Beispiel, wie dem Überprüfen, ob eine Datei existiert.
In der realen Welt möchten Sie möglicherweise überprüfen, ob eine Konfigurationsdatei existiert, bevor Sie eine erstellen. Sie möchten keine Zeit damit verschwenden, eine Konfigurationsdatei von Grund auf neu zu erstellen, nur um herauszufinden, dass bereits eine solche existiert.
Um zu überprüfen, ob eine Datei bereits existiert:
1. Öffnen Sie Ihr Terminal und führen Sie den folgenden Befehl touch aus, um eine neue Datei mit dem Namen test.txt zu erstellen. Dieser Befehl gibt keine Ausgabe aus, aber Sie werden die Datei im nächsten Schritt überprüfen.
2. Führen Sie anschließend den folgenden Befehl ls aus, um die neu erstellte Datei (test.txt) in Ihrem Arbeitsverzeichnis aufzulisten.
Die Ausgabe unten bestätigt, dass Sie die test.txt-Datei erfolgreich erstellt haben.
Nun, da Sie eine Testdatei haben, können Sie den Boilerplate-Codeblock in einem Bash-Skript verwenden, um zu überprüfen, ob die Datei in den folgenden Schritten existiert.

3. Führen Sie den folgenden Befehl aus, um eine neue Shell-Skriptdatei (if_file_exists.sh) zu erstellen (mit touch) und in Ihrem bevorzugten Texteditor (nano) zu öffnen.
4. Füllen Sie nun den folgenden Code in Ihre neue Datei if_file_exists.sh ein, speichern Sie die Datei und schließen Sie den Editor.
- Führt eine if-else-Anweisung aus, um zu überprüfen, ob eine bestimmte Datei vorhanden ist.
- Wenn der Operator true zurückgibt, erhalten Sie eine Meldung, dass die Datei vorhanden ist.
- Wenn der Operator false zurückgibt, erhalten Sie eine Meldung, dass die Datei nicht vorhanden ist. Dieses Mal wird die Datei automatisch erstellt und den Namen verwendet, den Sie in der VARIABLE „DATEI“ definiert haben.
Die Zeile #!/bin/bash oben in der Datei wird als Shebang bezeichnet. Ein Shebang gibt Ihrem System an, welchen Interpreter es verwenden soll, um das Skript auszuführen, in diesem Fall Bash. Wenn Sie keinen Shebang hinzufügen, verwendet Ihr System den Standardinterpreter, der möglicherweise nicht Bash ist. Das Fehlen des Shebangs kann dazu führen, dass Ihr Skript fehlschlägt.
5. Führen Sie den folgenden Befehl aus, um Ihr neues Skript auszuführen (if_file_exists.sh)
Wenn alles gut läuft, sehen Sie die Nachricht „test.txt existiert“ in Ihrem Terminal gedruckt, wie unten gezeigt.

6. Führen Sie als nächstes die folgenden Befehle aus, um die Testdatei (test.txt) zu löschen (rm -rf) und alle Dateien in Ihrem Arbeitsverzeichnis aufzulisten.
Nachfolgend können Sie überprüfen, dass die test.txt nicht mehr aufgeführt ist.

7. Führen Sie den folgenden Befehl erneut aus, um Ihr Skript if_file_exists.sh auszuführen.
Da die test.txt Datei nicht mehr existiert, erstellt das Skript eine neue test.txt Datei, wenn der -e Operator falsch zurückgibt.

8. Führen Sie abschließend den ls Befehl unten aus, um die test.txt Datei in Ihrem Arbeitsverzeichnis aufzulisten.
Die Ausgabe unten bestätigt, dass Ihr Skript eine neue test.txt Datei erstellt hat.

Überprüfen, ob eine Datei eine reguläre oder spezielle Datei ist
Bevor Sie eine Datei öffnen oder verarbeiten, möchten Sie möglicherweise zuerst überprüfen, ob diese Datei regulär oder speziell ist. Warum? Eine spezielle Datei ist ein Dateityp, der in einem Dateisystem gespeichert ist, daher sollten Sie vorsichtig sein, nicht mit diesen Dateien herumzuspielen.
Zum Beispiel tritt ein häufiger Fehler auf, wenn eine spezielle Datei geöffnet wird, der „Keine solche Datei oder Verzeichnis“ Fehler auf. Dieser Fehler tritt auf, wenn die Datei, die Sie zu öffnen versuchen, nicht existiert. Aber der gleiche Fehler kann auch auftreten, wenn eine spezielle Datei anstelle einer regulären Datei geöffnet wird.
Öffnen Sie eine neue special_file.sh Datei in Ihrem Texteditor, fügen Sie den folgenden Code hinzu und speichern Sie die Änderungen.
Der Code unten ist ähnlich zum vorherigen. Aber dieser Code verwendet den Operator -f
anstelle des Operators -e
. Der Operator -f
testet, ob eine bestimmte Datei (/dev/vmmon
) eine reguläre Datei ist.
Führen Sie nun den Befehl unten aus, um Ihr Skript special_file.sh
auszuführen.
Da die Datei (/dev/vmmon), die in der Variable FILE
angegeben ist, eine spezielle Datei ist, erhalten Sie die folgende Meldung.

Überprüfen, ob ein Verzeichnis existiert
Bisher haben Sie gelernt, wie Sie überprüfen können, ob eine Datei existiert. Aber gilt dasselbe Verfahren auch für Verzeichnisse? Ja, indem Sie den Testoperator -d
verwenden. Dieser Operator ist nützlich, wenn Sie basierend darauf handeln möchten, ob ein Verzeichnis vorhanden ist oder nicht.
Vielleicht möchten Sie alle Dateien von einem Verzeichnis in ein anderes kopieren. Wenn das Zielverzeichnis nicht existiert, können Sie es erstellen, bevor Sie die Dateien kopieren.
1. Führen Sie den folgenden Befehl ls aus, um das Verzeichnis example-dir vom Arbeitsverzeichnis aus aufzulisten.
Sie erhalten eine Meldung „Keine solche Datei oder Verzeichnis“, da das Verzeichnis nicht vorhanden ist. Wenn Sie nicht möchten, dass Ihr Ablauf unterbrochen wird, nur weil ein Verzeichnis nicht existiert, gehen Sie zum nächsten Schritt über.

2. Öffnen Sie anschließend eine neue Datei mit dem Namen if_dir_exists.sh in Ihrem Texteditor, fügen Sie den folgenden Code hinzu und speichern Sie die Datei. Der folgende Code überprüft, ob ein angegebenes Verzeichnis existiert, und führt je nachdem, welchen Wert der Operator -d zurückgibt, Aufgaben aus.
Sie können das gleiche Ergebnis erzielen, indem Sie die if- und else-Anweisungen umkehren und den Negationsoperator (!) verwenden. In realen Situationen kann der !-Operator dazu beitragen, ein saubereres und kürzeres Skript zu schreiben.
3. Führen Sie nun den folgenden Befehl aus, um Ihr Skript (if_dir_exists.sh) auszuführen.
Sie können die Nachricht sehen, die besagt, dass das Verzeichnis erstellt wurde und die Datei test.txt kopiert wurde, da das example_dir nicht existiert.

4. Führen Sie abschließend den Befehl ls gegen das Verzeichnis example_dir aus, um zu bestätigen, dass das Verzeichnis existiert und die Datei test.txt enthält.

Überprüfen, ob eine Datei leer ist
Sie wissen bereits, wie Sie die drei am häufigsten verwendeten Datei-Testoperatoren (-e
, -f
und -d
) verwenden, um Ihre Skripting-Fähigkeiten zu verbessern. Aber es gibt noch andere Operatoren, die Sie sich ansehen möchten.
Normalerweise führen Sie anstelle des Hervorhebens des Inhalts einer Datei, um ihn in eine andere Datei zu kopieren, einen Befehl aus, um die Arbeit für Sie zu erledigen. Aber halten Sie Ihre Pferde, da Ihre Zieldatei möglicherweise nicht leer ist.
Warum verwenden Sie nicht den -s
-Operator, um zu überprüfen, ob eine Datei existiert und nicht leer ist? Dieser Operator gibt true zurück, wenn die Datei existiert und eine Größe größer als Null hat.
1. Öffnen Sie eine neue Datei namens empty_file.sh in Ihrem Texteditor, fügen Sie den folgenden Code hinzu und speichern Sie die Datei.
Der folgende Code testet, ob eine angegebene Datei leer ist, und gibt eine Nachricht aus, je nachdem, welchen Wert der -s Operator zurückgibt.
2. Führen Sie nun den folgenden Befehl aus, um Ihr Skript (empty_file.sh) auszuführen.
Hier sehen Sie die Nachricht, dass test.txt entweder nicht existiert oder leer ist. Gleichzeitig fügt das Skript jedoch Text zur test.txt Datei hinzu.

3. Führen Sie den unten stehenden cat Befehl aus, um zu überprüfen, ob die Datei test.txt den hinzugefügten Text enthält.

4. Führen Sie schließlich den bash Befehl unten erneut aus, um das Skript empty_file.sh auszuführen.
Hier sehen Sie die Ausgabe, die sich auf test.txt existiert und nicht leer ist geändert hat, da die test.txt Datei nun etwas Text enthält und eine Größe größer als null (0) hat.

Überprüfung, ob eine Datei existiert und lesbar ist
Möglicherweise beinhaltet Ihre Automatisierung das Lesen von Dateien, um Aufgaben auszuführen. Der Erfolg dieser Aufgaben hängt davon ab, ob die Dateien lesbar sind. Das Schreiben eines Skripts, um zu überprüfen, ob eine Datei existiert und lesbar ist, ist eine nützliche Lösung.
Um zu zeigen, wie man überprüft, ob eine Datei vorhanden und lesbar ist:
1. Führen Sie den folgenden Befehl aus, um sich bei einem anderen Benutzerkonto (ata) anzumelden.
Ihre Eingabeaufforderung ändert sich ($) und zeigt an, dass Sie als der andere Benutzer angemeldet sind.

Alternativ können Sie die Berechtigung der Datei mit dem chmod-Befehl auf lesbar, beschreibbar oder beides ändern.
2. Sobald Sie angemeldet sind, erstellen Sie eine neue Datei namens readable_file.sh mit Ihrem Texteditor.
Fügen Sie den folgenden Code zur Datei readable_file.sh hinzu und speichern Sie die Änderungen. Dieser Code überprüft, ob eine Datei namens test.txt im Verzeichnis /root vorhanden und lesbar ist.
3. Führen Sie nun den folgenden Befehl aus, um das Skript readable_file.sh auszuführen.
Diesmal sehen Sie eine Nachricht, die besagt, dass /root/test.txt nicht existiert oder nicht lesbar ist. Da sich die Datei text.test im Verzeichnis /root befindet, hat der aktuelle Benutzer (ata) keine Leseberechtigungen für die Datei text.txt.

4. Führen Sie abschließend die untenstehenden Befehle aus, um Folgendes zu erreichen:
- Ändern Sie die sudoers-Datei, damit der aktuelle Benutzer (ata)
sudo
verwenden kann, um erhöhte Befehle auszuführen.
- Führen Sie das Skript readable_file.sh aus, das überprüft, ob eine bestimmte Datei lesbar ist.
Sie können unten sehen, dass die Ausgabe test.txt existiert und lesbar ist, weil der Benutzer ata nun Leseberechtigung für die Datei test.txt hat.

Fazit
A testing phase is always a priority before making drastic changes, whether on files or directories on your system. And in this tutorial, you’ve learned about the Bash file test operators and how to use them to test if a file (regular or special) or directory exists or if a file is readable or not.
Mit diesen neu erworbenen Fähigkeiten können Sie selbstbewusst entscheiden, welche Aktion basierend auf dem Ergebnis der Tests ausgeführt werden soll. Aber es gibt viele andere Möglichkeiten, die Bash-Dateitestoperatoren zu verwenden.
Warum nicht versuchen, die Erweiterung einer Datei zu überprüfen? Oder vielleicht überprüfen, ob mehrere Dateien existieren, um zu sehen, ob alle benötigten Dateien verfügbar sind?