3836 Stimmen

Wie kann ich feststellen, ob eine reguläre Datei in der Bash nicht existiert?

Ich habe das folgende Skript verwendet, um zu sehen, ob eine Datei existiert:

#!/bin/bash

FILE=$1     
if [ -f $FILE ]; then
   echo "File $FILE exists."
else
   echo "File $FILE does not exist."
fi

Was ist die richtige Syntax, wenn ich nur prüfen will, ob die Datei no existieren?

#!/bin/bash

FILE=$1     
if [ $FILE does not exist ]; then
   echo "File $FILE does not exist."
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.

25voto

Es gibt drei verschiedene Möglichkeiten, dies zu tun:

  1. Negieren Sie den Exit-Status mit der Bash (keine andere Antwort hat das gesagt):

    if ! [ -e "$file" ]; then
        echo "file does not exist"
    fi

    Oder:

    ! [ -e "$file" ] && echo "file does not exist"
  2. Negieren des Tests innerhalb des Testbefehls [ (das ist die Art und Weise, wie die meisten bisherigen Antworten präsentiert wurden):

    if [ ! -e "$file" ]; then
        echo "file does not exist"
    fi

    Oder:

    [ ! -e "$file" ] && echo "file does not exist"
  3. Handeln Sie, wenn der Test negativ ausfällt ( || anstelle von && ):

    Nur:

    [ -e "$file" ] || echo "file does not exist"

    Das sieht albern aus (IMO), verwenden Sie es nicht, es sei denn, Ihr Code muss auf die Bourne-Shell portierbar sein (wie die /bin/sh von Solaris 10 oder früher), denen der Pipeline-Negationsoperator ( ! ):

    if [ -e "$file" ]; then
        :
    else
        echo "file does not exist"
    fi

17voto

kta Punkte 18216
envfile=.env

if [ ! -f "$envfile" ]
then
    echo "$envfile does not exist"
    exit 1
fi

12voto

Um einen Test umzukehren, verwenden Sie "!". Dies entspricht dem logischen Operator "not" in anderen Sprachen. Versuchen Sie dies:

if [ ! -f /tmp/foo.txt ];
then
    echo "File not found!"
fi

Oder etwas anders geschrieben:

if [ ! -f /tmp/foo.txt ]
    then echo "File not found!"
fi

Oder Sie könnten es verwenden:

if ! [ -f /tmp/foo.txt ]
    then echo "File not found!"
fi

Oder alles zusammen zu pressen:

if ! [ -f /tmp/foo.txt ]; then echo "File not found!"; fi

Dies kann (unter Verwendung des "und"-Operators: &&) wie folgt geschrieben werden:

[ ! -f /tmp/foo.txt ] && echo "File not found!"

Das sieht kürzer aus als hier:

[ -f /tmp/foo.txt ] || echo "File not found!"

10voto

Lemon Kazi Punkte 3246

Dieser Code funktioniert auch.

#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
 echo "File '$FILE' Exists"
else
 echo "The File '$FILE' Does Not Exist"
fi

10voto

android developer Punkte 111449

Le site test Sache kann auch zählen. Bei mir hat es funktioniert (basierend auf Bash-Shell: Prüfen, ob eine Datei vorhanden ist oder nicht ):

test -e FILENAME && echo "File exists" || echo "File doesn't exist"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X