Oft müssen Sie beim Schreiben von Shell-Skripten Vorgänge basierend auf der Existenz einer Datei ausführen. Wie kann man also überprüfen, ob die Datei existiert? Der folgende Artikel zeigt Ihnen, wie Sie mit dem Testbefehl überprüfen, ob eine Datei oder ein Verzeichnis in Bash vorhanden ist. Ich hoffe, dass er für Sie hilfreich ist.
Testbefehl
In Bash können Sie mit dem Testbefehl prüfen, ob eine Datei vorhanden ist und identifizieren Sie den Dateityp.
Der Testbefehl hat eine der folgenden Syntaxformen:
test EXPRESSION [ EXPRESSION ] [[ EXPRESSION ]]
Wenn Sie möchten, dass Ihr Skript portierbar ist, sollten Sie lieber den alten Test [-Befehl verwenden, der auf allen POSIX-Shells verfügbar ist . Eine neue aktualisierte Version des Testbefehls [[ (doppelte Klammern) wird auf den meisten modernen Systemen unterstützt, die Bash, ZSH und KSH als Standard-Shell verwenden.
Dateioperatoren des Testbefehls
Der Testbefehl enthält die folgenden Dateioperatoren, die das Testen bestimmter Dateitypen ermöglichen:
● -b FILE: True, wenn FILE existiert und eine Block-Spezialdatei ist.
● -c FILE: True, wenn FILE existiert und eine Sonderzeichendatei ist.
● -d FILE: True, wenn FILE existiert und ein Verzeichnis ist.
● -e FILE: True, wenn FILE existiert und eine Datei ist, unabhängig vom Typ (Knoten, Verzeichnis, Socket usw.).
● -f FILE: True, wenn FILE existiert und eine reguläre Datei ist (kein Verzeichnis oder Gerät).
● -G FILE: True, wenn FILE vorhanden ist und sich in derselben Gruppe befindet wie der Benutzer, der den Befehl ausführt.
● -h FILE: True, wenn FILE existiert und ein symbolischer Link ist.
● -g FILE: True, wenn FILE vorhanden ist und das Set-Group-ID-Flag (sgid) gesetzt ist.
● -k FILE: True, wenn FILE vorhanden ist und das Sticky-Bit-Flag gesetzt ist.
● -L FILE: True, wenn FILE existiert und ein symbolischer Link ist.
● -O FILE: True, wenn FILE vorhanden ist und dem Benutzer gehört, der den Befehl ausführt.
● -p FILE: True, wenn FILE existiert und eine Pipe ist.
● -r FILE: True, wenn FILE existiert und lesbar ist.
● -S FILE: True, wenn FILE existiert und ein Socket ist.
● -s FILE: True, wenn FILE vorhanden ist und eine Größe ungleich Null hat.
● -u FILE: True, wenn vorhanden und die Flags set-user-id (suid) gesetzt sind.
● -w FILE: True, wenn FILE existiert und beschreibbar ist.
● -x FILE: True, wenn FILE existiert und ausführbar ist.
Wie überprüfe ich, ob eine Datei existiert?
Bei der Prüfung, ob eine Datei existiert, sind die am häufigsten verwendeten FILE-Operatoren -e und -f. Der erste Operator prüft, ob die Datei unabhängig vom Dateityp existiert. Der zweite Operator gibt nur „true“ zurück, wenn es sich bei der Datei um eine reguläre Datei handelt (kein Verzeichnis oder Gerät).
Bei der Überprüfung, ob eine Datei vorhanden ist, besteht die am besten lesbare Option darin, den Testbefehl in Verbindung mit einer if-Anweisung zu verwenden. Jeder der folgenden Snippets prüft, ob die Datei /etc/resolv.conf vorhanden ist:
FILE=/etc/resolv.conf if test -f "$FILE"; then echo "$FILE exist" fi
FILE=/etc/resolv.conf if [ -f "$FILE" ]; then echo "$FILE exist" fi
FILE=/etc/resolv.conf if [[ -f "$FILE" ]]; then echo "$FILE exist" fi
Wenn Sie basierend auf der Existenz der Datei unterschiedliche Aktionen ausführen möchten, verwenden Sie einfach eine Wenn/Dann-Struktur:
FILE=/etc/resolv.conf if [ -f "$FILE" ]; then echo "$FILE exist" else echo "$FILE does not exist" fi
Hinweis: Verwenden Sie immer doppelte Anführungszeichen, um Probleme beim Arbeiten mit Dateien zu vermeiden, deren Namen Leerzeichen enthalten.
Sie können den Testbefehl auch ohne eine if-Anweisung verwenden. Der Befehl nach dem &&-Operator wird nur ausgeführt, wenn der Exit-Status des Testbefehls wahr ist,
test -f /etc/resolv.conf && echo "$FILE exist"
[ -f /etc/resolv.conf ] && echo "$FILE exist"
[[ -f /etc/resolv.conf ] && echo "$FILE exist"
Wenn Sie eine Reihe von Befehlen nach dem &&-Operator ausführen möchten, schließen Sie die Befehle einfach mit „;“ ein. Oder in geschweiften Klammern, getrennt durch „&&“.
[ -f /etc/resolv.conf ] && { echo "$FILE exist"; cp "$FILE" /tmp/; }
Im Gegensatz zu & wird die Anweisung nach dem ||-Operator nur ausgeführt, wenn der Exit-Status des Testbefehls falsch ist.
[ -f /etc/resolv.conf ] && echo "$FILE exist" || echo "$FILE does not exist"
Wie überprüfe ich, ob ein Verzeichnis existiert?
Der Operator -d ermöglicht das Testen, ob eine Datei ein Verzeichnis ist.
Um beispielsweise zu überprüfen, ob das Verzeichnis /etc/docker existiert, würden Sie Folgendes verwenden:
FILE=/etc/docker if [ -d "$FILE" ]; then echo "$FILE is a directory" fi
[ -d /etc/docker ] && echo "$FILE is a directory"
Ebenso können Sie auch doppelte Klammern [[ anstelle einer einzelnen Klammer [] verwenden.
Wie überprüfe ich, ob eine Datei nicht existiert?
Ähnlich wie bei vielen anderen Sprachen funktioniert es! (Ausrufezeichen) Logischer NOT-Operator zum Negieren des Testausdrucks:
FILE=/etc/docker if [ ! -f "$FILE" ]; then echo "$FILE exist and it is a directory" fi
Das Gleiche wie oben:
[ ! -f /etc/docker ] || echo "$FILE does not exist"
Wie überprüfe ich, ob mehrere Dateien vorhanden sind?
Wenn mehrere Dateien vorhanden sind, können Sie -a (oder &&with[]) zum Testen verwenden, anstatt komplexe verschachtelte if/else-Konstrukte zu verwenden:
FILE=/etc/docker if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then echo "$FILE is a directory" fi
FILE=/etc/docker if [ -f /etc/resolv.conf && -f /etc/hosts ]; then echo "$FILE is a directory" fi
Äquivalente Variante ohne IF-Anweisung:
[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "both files exist"
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "both files exist"
Empfohlene verwandte Video-Tutorials: „Linux-Tutorial“
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er kann allen beim Lernen helfen. Weitere spannende Inhalte finden Sie in den entsprechenden Tutorial-Kolumnen auf der chinesischen PHP-Website! ! !
Das obige ist der detaillierte Inhalt vonSo überprüfen Sie, ob eine Datei oder ein Verzeichnis in Bash vorhanden ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!