Test des fichiers Bash
-b filename
- Bloquer le fichier spécial
-c filename
- Fichier de caractères spéciaux
-d directoryname
- Vérifier l'existence du répertoire
-e filename
- Vérifier l'existence des fichiers, quel que soit leur type (nœud, répertoire, socket, etc.)
-f filename
- Vérifier l'existence d'un fichier régulier et non d'un répertoire
-G filename
- Vérifier si le fichier existe et s'il appartient au groupe effectif ID
-G filename set-group-id
- Vrai si le fichier existe et est set-group-id
-k filename
- Morceau collant
-L filename
- Lien symbolique
-O filename
- Vrai si le fichier existe et est possédé par l'utilisateur effectif.
-r filename
- Vérifier si le fichier est lisible
-S filename
- Vérifier si le fichier est un socket
-s filename
- Vérifier si le fichier a une taille non nulle
-u filename
- Vérifier si le bit set-user-id du fichier est activé.
-w filename
- Vérifier si le fichier est accessible en écriture
-x filename
- Vérifier si le fichier est exécutable
Comment l'utiliser :
#!/bin/bash
file=./file
if [ -e "$file" ]; then
echo "File exists"
else
echo "File does not exist"
fi
A expression de test peuvent être niées en utilisant l'option !
opérateur
#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
echo "File does not exist"
else
echo "File exists"
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.
11 votes
@kevinarpe si vous voulez tester si quelque chose existe, utilisez
-e
. -f ne récupère pas les répertoires, les liens symboliques, etc.15 votes
Pour être sûr, utilisez toujours des guillemets doubles pour gérer correctement les noms de fichiers avec des espaces, par exemple,
FILE=$1
->FILE="$1"
yif [ -f $FILE ];
->if [ -f "$FILE" ];
0 votes
Malheureusement, cette méthode est sujette à des conditions de course et n'est pas utile dans la plupart des cas, à l'exception d'exemples triviaux de type "hello world".
1 votes
A propos de votre variable "$FILE" : Par convention, les variables d'environnement (PATH, EDITOR, SHELL, ...) et les variables internes de l'interpréteur de commandes (BASH_VERSION, RANDOM, ...) sont entièrement capitalisées. Tous les autres noms de variables doivent être en minuscules. Puisque les noms de variables sont sensibles à la casse, cette convention évite d'écraser accidentellement les variables d'environnement et internes.
0 votes
Duplicata possible de Bash : Comment vérifier si certains fichiers existent ?
3 votes
@jww C'est le contraire de cette question. Il s'agit de demander une syntaxe spécifique.