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 nicht existiert?

#!/bin/bash

FILE=$1     
if [ $FILE does not exist ]; then
   echo "File $FILE does not exist."
fi
Lösung

Der Befehl test (hier [) hat einen logischen Operator "not", der ein Ausrufezeichen ist (ähnlich wie in vielen anderen Sprachen). Versuchen Sie dies:

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

Sie können einen Ausdruck mit "!" negieren:

#!/bin/bash
FILE=$1

if [ ! -f "$FILE" ]
then
    echo "File $FILE does not exist"
fi

Die entsprechende Manpage ist man test oder, äquivalent, man [ -- oder help test oder help [ für den eingebauten Bash-Befehl.

Kommentare (3)
[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"

Es ist auch möglich, dass die Datei ein defekter symbolischer Link oder eine nicht-reguläre Datei ist, wie z.B. ein Socket, Gerät oder Fifo. Zum Beispiel, um eine Prüfung auf defekte Symlinks hinzuzufügen:

if [[ ! -f $FILE ]]; then
    if [[ -L $FILE ]]; then
        printf '%s is a broken symlink!\n' "$FILE"
    else
        printf '%s does not exist!\n' "$FILE"
    fi
fi
Kommentare (7)