Come faccio a sapere se un file regolare non esiste in Bash?

Ho usato il seguente script per vedere se esiste un file:

#!/bin/bash

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

Qual è la sintassi corretta da usare se voglio controllare solo se il file non esiste?

#!/bin/bash

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

Il comando test ([ qui) ha un operatore logico "not" che è il punto esclamativo (simile a molte altre lingue). Provate questo:

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

Si può negare un'espressione con "!":

#!/bin/bash
FILE=$1

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

La relativa pagina man è man test o, equivalentemente, man [ -- o help test o help [ per il comando built-in bash.

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

Inoltre, è possibile che il file sia un link simbolico rotto, o un file non regolare, come ad esempio un socket, un dispositivo o un fifo. Ad esempio, per aggiungere un controllo per i link simbolici rotti:

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
Commentari (7)