Heim > Betrieb und Instandhaltung > Betrieb und Wartung von Linux > So überprüfen Sie, ob eine Datei oder ein Verzeichnis in Bash vorhanden ist

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in Bash vorhanden ist

青灯夜游
Freigeben: 2019-03-22 16:33:49
Original
4874 Leute haben es durchsucht

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.

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in Bash vorhanden 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 ]]
Nach dem Login kopieren

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
Nach dem Login kopieren
FILE=/etc/resolv.conf
if [ -f "$FILE" ]; then
    echo "$FILE exist"
fi
Nach dem Login kopieren
FILE=/etc/resolv.conf
if [[ -f "$FILE" ]]; then
    echo "$FILE exist"
fi
Nach dem Login kopieren

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
Nach dem Login kopieren

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"
Nach dem Login kopieren
[ -f /etc/resolv.conf ] && echo "$FILE exist"
Nach dem Login kopieren
[[ -f /etc/resolv.conf ] && echo "$FILE exist"
Nach dem Login kopieren

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/; }
Nach dem Login kopieren

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"
Nach dem Login kopieren

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
Nach dem Login kopieren
[ -d /etc/docker ] && echo "$FILE is a directory"
Nach dem Login kopieren

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
Nach dem Login kopieren

Das Gleiche wie oben:

[ ! -f /etc/docker ] || echo "$FILE does not exist"
Nach dem Login kopieren

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
Nach dem Login kopieren
FILE=/etc/docker
if [ -f /etc/resolv.conf && -f /etc/hosts ]; then
    echo "$FILE is a directory"
fi
Nach dem Login kopieren

Äquivalente Variante ohne IF-Anweisung:

[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "both files exist"
Nach dem Login kopieren
[[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "both files exist"
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage