Apprendre les opérateurs de test de fichier Bash avec des exemples

Bash est incroyablement flexible et offre différentes options pour tester les fichiers. Et si vous cherchez un moyen de tester vos fichiers, les opérateurs de test de fichiers Bash vous mèneront loin.

Dans ce tutoriel, vous apprendrez différents opérateurs de test de fichiers et comment les utiliser pour tester si un fichier existe, est lisible, est vide, et ainsi de suite.

Lisez la suite et devenez ami avec les opérateurs de test de fichiers Bash !

Prérequis

Ce tutoriel sera une démonstration pratique. Si vous souhaitez suivre, assurez-vous d’avoir ce qui suit :

  • A Linux system with Bash installed – This tutorial uses Ubuntu 20.04.

La plupart des distributions Linux ont Bash installé par défaut. Mais si vous utilisez Windows, vous pouvez installer le sous-système Windows pour Linux (WSL) pour obtenir un shell Bash.

  • A user account with sudo privileges to run commands as root – This tutorial uses a root account for simplicity. But using a non-root user with sudo access is always recommended.
  • Ce tutoriel suppose que vous avez un accès SSH à votre système Linux.

Quels sont les opérateurs de test de fichiers Bash?

Avant de vous salir les mains avec les opérateurs de test, jetez un coup d’œil à leur fonctionnement. Les opérateurs de test de fichiers vous permettent de tester différents aspects d’un fichier comme son existence, sa lisibilité/écriture, etc.

L’utilisation des opérateurs de test de fichiers peut aider à prévenir les erreurs dans vos scripts Bash. Le code ci-dessous est un canevas pour l’instruction if. L’instruction if-else est un outil puissant que vous verrez souvent dans les scripts Bash.

Rappelez-vous que les parties then et else du bloc de code sont facultatives. Vous pouvez utiliser une instruction if sans elles.

# Représente le fichier que vous voulez tester. 
# Remplacez file_name par le nom du fichier cible à tester.
FILE="file_name"
# Opérateur - L'opérateur de test de fichier à utiliser.
if [ Operator $FILE ]

then
 # Tâches à effectuer si l'opérateur renvoie vrai.
 do something

else
 # Tâches à effectuer si l'opérateur renvoie faux.
 do something

fi

Vérification de l’existence d’un fichier

Vous avez vu un aperçu de comment les opérateurs de test fonctionnent, mais ce n’est pas suffisant pour mieux comprendre les tenants et aboutissants de leur utilisation. Commencez donc par un exemple de base, comme vérifier si un fichier existe.

Dans le monde réel, vous voudrez peut-être vérifier si un fichier de configuration existe avant d’en créer un. Vous ne voulez pas perdre de temps à construire un fichier de configuration à partir de zéro juste pour découvrir que le même existe déjà.

Pour vérifier si un fichier existe déjà:

1. Ouvrez votre terminal et exécutez la commande touch ci-dessous pour créer un nouveau fichier test.txt . Cette commande ne fournit pas de sortie, mais vous vérifierez le fichier à l’étape suivante.

touch test.txt

2. Ensuite, exécutez la commande ls suivante pour lister le fichier nouvellement créé (test.txt) dans votre répertoire de travail.

ls -al test.txt

La sortie ci-dessous confirme que vous avez créé avec succès le fichier test.txt.

Maintenant que vous avez un fichier de test, vous pouvez utiliser le bloc de code de base dans un script Bash pour vérifier si le fichier existe dans les étapes suivantes.

Listing the newly-created file

3. Exécutez la commande ci-dessous pour créer (touch), et ouvrir un nouveau fichier de script shell (if_file_exists.sh) dans votre éditeur de texte préféré (nano).

touch if_file_exists.sh && nano if_file_exists.sh

4. Ensuite, insérez le code ci-dessous dans votre nouveau fichier if_file_exists.sh , enregistrez le fichier et fermez l’éditeur.

  • Exécute une déclaration if-else pour vérifier si un fichier spécifié existe.
  • Si l’opérateur renvoie vrai, vous obtiendrez un message indiquant que le fichier existe.
  • Si l’opérateur renvoie faux, vous obtiendrez un message indiquant que le fichier n’existe pas. Mais cette fois, le fichier est créé automatiquement en utilisant le nom que vous avez défini dans la variable FILE.

La ligne #!/bin/bash en haut du fichier est appelée shebang. Un shebang indique à votre système quel interpréteur utiliser pour exécuter le script, dans ce cas, Bash. Si vous n’incluez pas de shebang, votre système utilise l’interpréteur par défaut, qui peut ne pas être Bash. L’absence de shebang peut entraîner l’échec de votre script.

#!/bin/bash
# FILE - Une variable qui contient la valeur du fichier que vous souhaitez tester.
# Vous pouvez réutiliser ce même bloc de code pour tester différents fichiers 
  # en modifiant la valeur de la variable $FILE.
FILE="test.txt"

# L'opérateur -e teste l'existence du fichier
if [ -e $FILE ]
then
  # Si l'opérateur renvoie vrai, affiche un message indiquant que le fichier existe.
  echo "$FILE exists"
else
  # Si l'opérateur renvoie vrai, affiche un message indiquant que le fichier n'existe pas,
    # puis crée le fichier avec le nom que vous avez défini dans la variable FILE.
  echo "$FILE does not exist, creating new file" && touch test.txt
fi

5. Exécutez la commande ci-dessous pour exécuter votre nouveau script (if_file_exists.sh)

bash if_file_exists.sh

Si tout se passe bien, vous verrez le message indiquant que test.txt existe imprimé dans votre terminal, comme illustré ci-dessous.

test.txt exists

6. Ensuite, exécutez les commandes suivantes pour supprimer (rm -rf) le fichier de test (test.txt) et lister tous les fichiers de votre répertoire de travail.

rm -rf test.txt
ls test.txt

Ci-dessous, vous pouvez vérifier que le fichier test.txt n’est plus répertorié.

Deleting the test file

7. Relancez la commande ci-dessous pour exécuter votre script if_file_exists.sh.

Étant donné que le fichier test.txt n’existe plus, le script crée un nouveau fichier test.txt lorsque l’opérateur -e renvoie false.

bash if_file_exists.sh
Rerun your if_file_exists.sh script

8. Enfin, exécutez la commande ls ci-dessous pour répertorier le fichier test.txt dans votre répertoire de travail.

ls -al test.txt

La sortie ci-dessous confirme que votre script a créé un nouveau fichier test.txt.

Listing the new test.txt file

Vérification si un fichier est un fichier ordinaire ou spécial

Avant d’ouvrir ou de traiter un fichier, vous voudrez peut-être vérifier d’abord si ce fichier est ordinaire ou spécial. Pourquoi? Un fichier spécial est un type de fichier stocké dans un système de fichiers, alors faites attention de ne pas jouer avec ces fichiers.

Par exemple, une erreur courante lors de l’ouverture d’un fichier spécial est l’erreur « Aucun fichier ou dossier de ce type ». Cette erreur se produit lorsque le fichier que vous essayez d’ouvrir n’existe pas. Mais la même erreur peut également se produire lors de l’ouverture d’un fichier spécial au lieu d’un fichier ordinaire.

Ouvrez un nouveau fichier special_file.sh dans votre éditeur de texte, ajoutez le code suivant et enregistrez les modifications.

Le code ci-dessous est similaire à celui précédent. Mais ce code utilise l’opérateur -f au lieu de l’opérateur -e. L’opérateur -f teste si un fichier spécifié (/dev/vmmon) est un fichier régulier.

#!/bin/bash
# Le fichier /dev/vmmon est un fichier spécial
  # utilisé pour communiquer avec les périphériques matériels sous Linux.
FILE="/dev/vmmon"

# Tester si le fichier 
if [ -f $FILE ]
then
  # Si l'opérateur renvoie vrai, vous obtiendrez un message disant
    # que le fichier est un fichier régulier.
  echo "$FILE is a regular file"

else
  # Si l'opérateur renvoie vrai, vous obtiendrez un message disant 
    # que le fichier n'existe pas ou est un fichier régulier.
  echo "Either $FILE does not exist or is not a regular file"

fi

Maintenant, exécutez la commande ci-dessous pour exécuter votre script special_file.sh.

bash special_file.sh

Étant donné que le fichier (/dev/vmmon) spécifié dans la variable FILE est un fichier spécial, vous obtiendrez le message ci-dessous.

Checking if a file is a regular file

Vérification de l’existence d’un répertoire

Jusqu’à présent, vous avez appris à vérifier si un fichier existe. Mais la même méthode s’applique-t-elle aux répertoires ? Oui, en utilisant l’opérateur de test -d. Cet opérateur est pratique si vous prévoyez d’agir en fonction de l’existence ou non d’un répertoire.

Peut-être souhaitez-vous copier tous les fichiers d’un répertoire vers un autre. Si le répertoire cible n’existe pas, vous pouvez le créer avant de copier les fichiers.

1. Exécutez la commande ls ci-dessous pour afficher la liste de example-dir à partir du répertoire de travail.

ls -la example-dir

Vous obtiendrez un message indiquant « Aucun fichier ou dossier de ce type » car le répertoire n’existe pas. Si vous ne souhaitez pas interrompre le déroulement en cas d’absence de répertoire, passez à l’étape suivante.

Listing the example-dir from the working directory

2. Ensuite, ouvrez un nouveau fichier nommé si_rep_existe.sh dans votre éditeur de texte, ajoutez le code ci-dessous et enregistrez le fichier. Le code suivant teste si un répertoire spécifié existe et effectue des actions en fonction de la valeur renvoyée par l’opérateur -d.

Vous pouvez obtenir le même résultat en inversant les instructions if et else en utilisant l’opérateur de négation (!). Dans des situations réelles, l’opérateur ! peut aider à écrire un script plus propre et plus concis.

#!/bin/bash
# Définir le nom du répertoire dans la variable dir
dir=example_dir

# Tester si le répertoire (dir) existe
if [ ! -d $dir ]
then
  # Si l'opérateur renvoie true, créer un répertoire avec la valeur de la variable dir
  mkdir $dir
  # Copier le fichier test.txt dans le répertoire nouvellement créé
  cp test.txt $dir
  # Afficher un message sur les tâches effectuées ci-dessus.
  echo "The directory has been created, and the test.txt file has been copied."
else
  # Si l'opérateur renvoie false, 
    # la commande echo affiche un message indiquant que le répertoire existe.
  echo "Directory $dir exists"
fi

3. Maintenant, exécutez la commande ci-dessous pour exécuter votre script (si_rep_existe.sh)

bash if_dir_exists.sh

Vous pouvez voir le message indiquant que le répertoire a été créé et que le fichier test.txt a été copié, car le répertoire example_dir n’existe pas.

Executing the if_dir_exists.sh to test if a directory exists

4. Enfin, exécutez la commande ls sur le répertoire example_dir pour confirmer que le répertoire existe et contient le fichier test.txt.

ls -la example_dir
Confirming the example_dir directory exists and contains the test.txt file

Vérification si un fichier est vide

Vous savez déjà comment utiliser les trois opérateurs de test de fichier les plus utilisés (-e, -f et -d) pour améliorer vos compétences en script. Mais il existe d’autres opérateurs que vous aimeriez explorer.

Généralement, au lieu de mettre en surbrillance le contenu d’un fichier pour le copier dans un autre fichier, vous exécuteriez une commande pour effectuer le travail à votre place. Mais attendez-vous, car votre fichier cible pourrait ne pas être vide.

Pourquoi ne pas utiliser l’opérateur -s pour vérifier si un fichier existe et n’est pas vide ? Cet opérateur renvoie vrai si le fichier existe et a une taille supérieure à zéro.

1. Ouvrez un nouveau fichier nommé empty_file.sh dans votre éditeur de texte, ajoutez le code suivant et enregistrez le fichier.

Le code suivant teste si un fichier spécifié est vide et affiche un message en fonction de la valeur renvoyée par l’opérateur -s.

#!/bin/bash
# Définit le nom du fichier cible
FILE=test.txt

# L'opérateur -s teste si le fichier cible existe et n'est pas vide
if [ -s $FILE ]
then
  # Si l'opérateur renvoie true, la commande echo imprime un message
    # indiquant que le fichier existe et n'est pas vide.
  echo "$FILE exists and is not empty"
else
  # Si l'opérateur renvoie false, la commande echo imprime un message
    # indiquant que le fichier n'existe pas ou est vide.
  echo "$FILE either does not exist or is empty"
  # Ajouter du texte au fichier cible
  echo "This is a test. This is not an empty file" > $FILE
fi

2. Maintenant, exécutez la commande ci-dessous pour exécuter votre script (empty_file.sh).

bash empty_file.sh

Vous pouvez voir ci-dessous le message indiquant que test.txt n’existe pas ou est vide. Mais simultanément, le script ajoute du texte au fichier test.txt.

Executing the empty_file.sh file to test if the text.txt file is empty

3. Exécutez la commande cat ci-dessous pour vérifier que le fichier test.txt contient le texte ajouté.

cat test.text
Verifying the text.txt file’s content

4. Enfin, réexécutez la commande bash ci-dessous pour exécuter le script empty_file.sh.

bash empty_file.sh

Vous pouvez voir ci-dessous que la sortie a changé pour test.txt existe et n’est pas vide, puisque le fichier test.txt contient maintenant du texte et a une taille supérieure à zéro (0).

Rerunning the empty_file.sh script to check if the test.txt file is empty

Vérifier si un fichier existe et est lisible

Peut-être que votre automatisation implique de lire des fichiers pour effectuer des tâches. Le succès de ces tâches dépendra de la lisibilité des fichiers. Écrire un script pour vérifier si un fichier existe et est lisible sera utile comme solution.

Pour démontrer la vérification de l’existence et de la lisibilité d’un fichier :

1. Exécutez la commande suivante pour vous connecter à un autre compte utilisateur (ata).

su - ata

Votre invite ($) change pour indiquer que vous êtes connecté en tant qu’autre utilisateur.

Logging in to another user account

Alternativement, vous pouvez modifier les autorisations du fichier pour le rendre lisible, inscriptible, ou les deux avec la commande chmod.

2. Une fois connecté, créez un nouveau fichier appelé readable_file.sh avec votre éditeur de texte

Ajoutez le code suivant au fichier readable_file.sh et enregistrez les modifications. Ce code vérifie si un fichier appelé test.txt dans le répertoire /root existe et est lisible.

#!/bin/bash
# Définir le fichier cible
FILE=test.txt

# Tester si le fichier cible est lisible.
# Vous pouvez changer -r par -w pour tester si un fichier est inscriptible à la place.
if [ -r $FILE ] 
then  
  # Si l'opérateur renvoie vrai, imprimez un message indiquant
    # que le fichier existe et est lisible.
  echo "$FILE exists and is readable" 
else  
  # Si l'opérateur renvoie faux, imprimez un message indiquant
    # que le fichier n'existe pas ou n'est pas lisible. 
  echo "$FILE does not exist or is unreadable"
fi

3. Maintenant, exécutez la commande ci-dessous pour exécuter le script readable_file.sh.

bash readable_file.sh

Cette fois, vous verrez un message indiquant que le fichier /root/test.txt n’existe pas ou n’est pas lisible. Étant donné que le fichier text.test est situé dans le répertoire /root, l’utilisateur actuel (ata) n’a pas les autorisations de lecture pour le fichier text.txt.

Executing the readable_file.sh script

4. Enfin, exécutez les commandes ci-dessous pour effectuer les opérations suivantes :

  • Modifiez le fichier sudoers pour permettre à l’utilisateur actuel (ata) d’utiliser sudo pour exécuter des commandes élevées.
  • Exécutez le script readable_file.sh, qui teste si un fichier spécifique est lisible.
sudo bash
bash readable_file.sh

Vous pouvez voir ci-dessous que la sortie imprime que test.txt existe et est lisible car l’utilisateur ata a maintenant la permission de lire le fichier test.txt.

Changing the sudoers file and executing the readable_file.sh script

Conclusion

A testing phase is always a priority before making drastic changes, whether on files or directories on your system. And in this tutorial, you’ve learned about the Bash file test operators and how to use them to test if a file (regular or special) or directory exists or if a file is readable or not.

Avec ces compétences nouvellement acquises, vous pouvez décider en toute confiance de l’action à prendre en fonction du résultat des tests. Mais il existe de nombreuses autres façons d’utiliser les opérateurs de test de fichiers Bash.

Pourquoi ne pas essayer de vérifier l’extension d’un fichier ? Ou peut-être vérifier si plusieurs fichiers existent pour voir si tous les fichiers dont vous avez besoin sont disponibles ?

Source:
https://adamtheautomator.com/bash-file-test/