3586 votes

Comment savoir si un fichier régulier n'existe pas dans Bash ?

J'ai utilisé le script suivant pour voir si un fichier existe :

#!/bin/bash

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

Quelle est la syntaxe correcte à utiliser si je veux seulement vérifier si le fichier fait no existent ?

#!/bin/bash

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

209 votes

J'ai trouvé ceci liste des instructions conditionnelles de bash très utile.

11 votes

Étant la personne très paresseuse que je suis, j'aurais typiquement utilisé la construction de contournement stupide suivante : if [ -f $FILE ]; then; else; echo "File $FILE does not exist."; fi; C'est probablement une bonne chose que j'aie trouvé cette question à la place et que j'aie appris à le faire d'une manière plus correcte :)

6 votes

Pour être pendulaire, vous devriez dire "fichier ordinaire", car la plupart des documents UNIX/POSIX font référence de manière générique à tous les types d'entrées du système de fichiers par le simple terme "fichiers", par exemple, un lien symbolique est un type de fichier, tout comme un tuyau nommé, un fichier ordinaire, un répertoire, un bloc spécial, un caractère spécial, une socket, etc.

24voto

Il existe trois façons distinctes de procéder :

  1. Négligez le statut de sortie avec bash (aucune autre réponse ne l'a dit) :

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

    Ou :

    ! [ -e "$file" ] && echo "file does not exist"
  2. Négation du test dans la commande de test [ (c'est ainsi que la plupart des réponses précédentes ont été présentées) :

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

    Ou :

    [ ! -e "$file" ] && echo "file does not exist"
  3. Agir sur le résultat du test qui est négatif ( || au lieu de && ):

    Seulement :

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

    Cela a l'air stupide (IMO), ne l'utilisez pas à moins que votre code ne doive être portable vers le shell Bourne (comme la commande /bin/sh de Solaris 10 ou antérieur) qui ne disposaient pas de l'opérateur de négation du pipeline ( ! ):

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

0 votes

Toute différence de portabilité entre ! [ y [ ! ?

3 votes

El ! [ est POSIX pour les pipelines shell 2.9.2 (toute commande) Otherwise, the exit status shall be the logical NOT of the exit status of the last command y [ ! est POSIX pour le test ! expression True if expression is false. False if expression is true. Ainsi, les deux sont POSIX, et d'après mon expérience, les deux sont largement supportés.

1 votes

@FrozenFlame, l'interpréteur de commande Bourne n'avait pas le ! qui a été introduit par le shell Korn. À l'exception peut-être de Solaris 10 et plus, il est peu probable que vous rencontriez un shell Bourne de nos jours.

11voto

bize Points 81

Pour annuler un test, utilisez " !". C'est l'équivalent de l'opérateur logique "not" dans d'autres langues. Essayez ceci :

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

Ou écrit d'une manière légèrement différente :

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

Ou vous pourriez utiliser :

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

Ou encore, présider tous ensemble :

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

Ce qui peut s'écrire (en utilisant l'opérateur "et" : &&) comme :

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

Ce qui ressemble plus brièvement à ceci :

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

10voto

android developer Points 20939

El test peut aussi compter. Cela a fonctionné pour moi (sur la base de Bash Shell : Vérifier si le fichier existe ou non ):

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

10voto

Lemon Kazi Points 18

Ce code fonctionne également.

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

7voto

lancerex Points 68

Le moyen le plus simple

FILE=$1
[ ! -e "${FILE}" ] && echo "does not exist" || echo "exists"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X