Bash File Testing
-b filename
- Spezielle Datei blockieren
-c filename
- Datei mit Sonderzeichen
-d directoryname
- Prüfung auf Vorhandensein eines Verzeichnisses
-e filename
- Prüfen, ob eine Datei vorhanden ist, unabhängig vom Typ (Knoten, Verzeichnis, Socket, usw.)
-f filename
- Prüfung auf Existenz einer regulären Datei, nicht eines Verzeichnisses
-G filename
- Prüfen, ob die Datei existiert und der effektiven Gruppen-ID gehört
-G filename set-group-id
- Wahr, wenn die Datei existiert und set-group-id ist
-k filename
- Klebriges Bit
-L filename
- Symbolische Verbindung
-O filename
- Wahr, wenn die Datei existiert und im Besitz der effektiven Benutzerkennung ist
-r filename
- Prüfen, ob die Datei lesbar ist
-S filename
- Prüfen, ob die Datei ein Socket ist
-s filename
- Prüfen, ob die Datei eine Größe ungleich Null hat
-u filename
- Prüfen, ob das set-user-id-Bit der Datei gesetzt ist
-w filename
- Prüfen, ob die Datei beschreibbar ist
-x filename
- Prüfen, ob die Datei ausführbar ist
Wie zu verwenden:
#!/bin/bash
file=./file
if [ -e "$file" ]; then
echo "File exists"
else
echo "File does not exist"
fi
A Testausdruck kann durch die Verwendung der !
Betreiber
#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
echo "File does not exist"
else
echo "File exists"
fi
226 Stimmen
Ich habe dies gefunden Liste der Bash-Bedingungsanweisungen sehr nützlich.
11 Stimmen
Da ich ein sehr fauler Mensch bin, hätte ich normalerweise die folgende alberne Umgehungskonstruktion verwendet:
if [ -f $FILE ]; then; else; echo "File $FILE does not exist."; fi;
Wahrscheinlich ist es gut, dass ich stattdessen diese Frage gefunden und gelernt habe, wie man es richtig macht :)7 Stimmen
Der Einfachheit halber sollten Sie "reguläre Datei" sagen, da die meisten UNIX/POSIX-Dokumente alle Arten von Dateisystemeinträgen einfach als "Dateien" bezeichnen, z. B. ist ein symbolischer Link eine Art von Datei, ebenso wie eine benannte Pipe, eine reguläre Datei, ein Verzeichnis, ein Block-Special, ein Character-Special, ein Socket usw.
12 Stimmen
@kevinarpe wenn Sie testen wollen, ob etwas existiert, verwenden Sie
-e
. -f erkennt keine Verzeichnisse, Symlinks usw.15 Stimmen
Um sicher zu gehen, verwenden Sie immer doppelte Anführungszeichen, um Dateinamen mit Leerzeichen korrekt zu behandeln, z.B.,
FILE=$1
->FILE="$1"
etif [ -f $FILE ];
->if [ -f "$FILE" ];
0 Stimmen
Leider ist dies anfällig für Race Conditions und in den meisten Anwendungsfällen nicht sinnvoll, abgesehen von trivialen Hallo-Welt-Beispielen.
1 Stimmen
Als Randbemerkung und in Bezug auf Ihre Variable "$FILE": Konventionell werden Umgebungsvariablen (PATH, EDITOR, SHELL, ...) und interne Shell-Variablen (BASH_VERSION, RANDOM, ...) großgeschrieben. Alle anderen Variablennamen sollten klein geschrieben werden. Da bei Variablennamen zwischen Groß- und Kleinschreibung unterschieden wird, verhindert diese Konvention, dass Umgebungsvariablen und interne Variablen versehentlich überschrieben werden.
0 Stimmen
Mögliches Duplikat von Bash: Wie prüfe ich, ob bestimmte Dateien existieren?
3 Stimmen
@jww Dies ist das Gegenteil dieser Frage. Hier wird nach einer bestimmten Syntax gefragt.