variable - while bash




Comment savoir si un fichier standard n'existe pas dans Bash? (12)

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 n'existe pas ?

#!/bin/bash

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

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

Ce script shell fonctionne également pour trouver un fichier dans un répertoire:

echo "enter file"

read -r a

if [ -s /home/trainee02/"$a" ]
then
    echo "yes. file is there."
else
    echo "sorry. file is not there."
fi

Il vaut la peine de mentionner que si vous devez exécuter une seule commande, vous pouvez abréger

if [ ! -f "$file" ]; then
    echo "$file"
fi

à

test -f "$file" || echo "$file"

ou

[ -f "$file" ] || echo "$file"

Il y a trois façons distinctes de le faire:

  1. Annulez le statut de sortie avec bash (aucune autre réponse n’a dit cela):

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

    Ou:

    ! [ -e "$file" ] && echo "file does not exist"
    
  2. Annulez le test dans la commande de test [ (c’est la façon dont la plupart des réponses ont été présentées auparavant):

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

    Ou:

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

    Seulement:

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

    Cela semble idiot (IMO), ne l'utilisez pas sauf si votre code doit être portable dans le shell Bourne (comme le /bin/sh de Solaris 10 ou une version antérieure) dépourvu de l'opérateur de négation de pipeline ( ! ):

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

La commande de test ( [ ici] a un opérateur logique "pas" qui est le point d'exclamation (similaire à de nombreuses autres langues). Essaye ça:

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


Parfois, il peut être utile d’utiliser && et || les opérateurs.

Comme dans (si vous avez la commande "test"):

test -b $FILE && echo File not there!

ou

test -b $FILE || echo File there!

Pour inverser un test, utilisez "!". Cela équivaut à l'opérateur logique "pas" dans d'autres langues. Essaye ça:

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 pouvez utiliser:

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

Ou, présidant tous ensemble:

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

Ce qui peut être écrit (en utilisant then "et" operator: &&) comme:

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

Ce qui ressemble plus court à ceci:

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

Tu peux le faire:

[[ ! -f "$FILE" ]] && echo "File doesn't exist"

ou

if [[ ! -f "$FILE" ]]; then
    echo "File doesn't exist"
fi

Si vous voulez vérifier le fichier et le dossier, utilisez l'option -e au lieu de -f . -e renvoie true pour les fichiers normaux, les répertoires, les sockets, les fichiers spéciaux de caractères, le blocage de fichiers spéciaux, etc.


Vous devez être prudent lors de l'exécution du test pour une variable non citée, car elle pourrait produire des résultats inattendus:

$ [ -f ]
$ echo $?
0
$ [ -f "" ]
$ echo $?
1

Il est généralement recommandé de mettre la variable testée entre guillemets:

#!/bin/sh
FILE=$1

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

Test de fichier Bash

-b filename - Bloquer le fichier spécial
-c filename - Fichier de caractères spéciaux
-d directoryname - Vérifie l'existence du répertoire.
-e filename - Vérifie l'existence du fichier, quel que soit son type (nœud, répertoire, socket, etc.)
-f filename - Vérifie l'existence d'un fichier normal et non d'un répertoire
-G filename - Vérifie si le fichier existe et appartient à l'ID du groupe effectif
-G filename set-group-id - True si le fichier existe et correspond à set-group-id
-k filename - bit collant
-L filename - lien symbolique
-O filename - Vrai si le fichier existe et appartient à l'ID utilisateur effectif
-r filename - Vérifie si le fichier est lisible
-S filename - Vérifie si le fichier est un socket
-s filename - Vérifie si la taille du fichier est différente de zéro
-u filename - Vérifie si le bit set-user-id du fichier est défini
-w filename - Vérifie si le fichier est accessible en écriture
-x filename - Vérifie si le fichier est exécutable

Comment utiliser:

#!/bin/bash
file=./file
if [ -e "$file" ]; then
    echo "File exists"
else 
    echo "File does not exist"
fi 

Une expression de test peut être annulée à l'aide de ! opérateur

#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
    echo "File does not exist"
else 
    echo "File exists"
fi 

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

En outre, il est possible que le fichier soit un lien symbolique brisé, ou un fichier non standard, comme par exemple un socket, un périphérique ou un fifo. Par exemple, pour ajouter une vérification des liens symboliques rompus:

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




scripting