Recherche de site Web

Différentes façons de lire un fichier dans un script Bash à l'aide de la boucle While


Cet article explique comment lire des fichiers dans des scripts bash à l'aide d'une boucle while. La lecture d'un fichier est une opération courante en programmation. Vous devez connaître les différentes méthodes et savoir laquelle est la plus efficace à utiliser. Dans bash, une seule tâche peut être réalisée de plusieurs manières, mais il existe toujours une manière optimale d'accomplir la tâche et nous devons la suivre.

Avant de voir comment lire le contenu d'un fichier à l'aide de la boucle while, un aperçu rapide du fonctionnement de la boucle while. La boucle While évalue une condition et parcourt un ensemble donné de codes lorsque la condition est vraie.

while [ CONDITION ]
do
    code block
done

Décomposons la syntaxe de la boucle while.

  • La boucle while doit commencer par un mot-clé while suivi d'une condition.
  • Une condition doit être placée entre [ ] ou [[ ]]. La condition doit toujours retourner vraie pour que la boucle soit exécutée.
  • Le bloc de code lui-même sera placé entre do et done.
NUMBER=0

while [[ $NUMBER -le 10 ]]
do
    echo " Welcome ${NUMBER} times "
    (( NUMBER++ ))
done

Il s'agit d'un exemple très simple, où la boucle s'exécute jusqu'à ce que NUMBER ne soit pas supérieur à 10 et imprime l'instruction echo.

En plus de while, nous utiliserons la commande read pour lire le contenu d'un fichier ligne par ligne. Vous trouverez ci-dessous la syntaxe de la façon dont les commandes while et read sont combinées. Il existe maintenant différentes manières de transmettre le fichier en entrée et nous les verrons toutes.

SYNTAX
while read VARIABLE
do
    code
done

Tuyauterie sous Linux

Normalement, nous utiliserons la commande cat pour afficher le contenu du fichier depuis le terminal. De plus, nous redirigerons la sortie de la commande cat vers d'autres commandes comme grep, sort, etc.

De même, nous utiliserons ici la commande cat pour lire le contenu du fichier et le rediriger vers une boucle while. Pour la démonstration, j'utilise le fichier /etc/passwd mais il n'est pas conseillé de jouer avec ce fichier, alors prenez une copie de sauvegarde de ce fichier et jouez avec si vous le souhaitez.

cat /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

Décomposons ce qui se passera lorsque le code ci-dessus sera soumis.

  • cat /etc/passwd lira le contenu du fichier et le transmettra en entrée via le tube.
  • La commande read lit chaque ligne passée en entrée de la commande cat et la stocke dans la variable LREAD.
  • La commande read lira le contenu du fichier jusqu'à ce que EOL soit interprété.

Vous pouvez également utiliser d'autres commandes comme head, tail et les diriger vers la boucle while.

head -n 5 /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

Redirection d'entrée sous Linux

Nous pouvons rediriger le contenu du fichier vers une boucle while en utilisant l'opérateur de redirection d'entrée (<).

while read LREAD
do
    echo ${LREAD}
done < /etc/passwd | head -n 5

Vous pouvez également stocker le nom du fichier dans une variable et le transmettre via un opérateur de redirection.

FILENAME="/etc/passwd"

while read LREAD
do
    echo ${LREAD}
done < ${FILENAME}

Vous pouvez également transmettre des noms de fichiers comme argument à votre script.

while read LREAD
do
    echo ${LREAD}
done < $1 | head -n 5

Séparateur de champ interne

Vous pouvez travailler avec différents types de formats de fichiers (CSV, TXT, JSON) et vous souhaiterez peut-être diviser le contenu du fichier en fonction de un délimiteur personnalisé. Dans ce cas, vous pouvez utiliser « Séparateur de champ interne (IFS) » pour diviser le contenu du fichier et le stocker dans des variables.

Laissez-moi vous montrer comment cela fonctionne. Jetez un œil au fichier /etc/passwd qui a deux points (:) comme délimiteur. Vous pouvez désormais diviser chaque mot d'une ligne et le stocker dans une variable distincte.

Dans l'exemple ci-dessous, je divise le fichier /etc/passwd avec deux points comme séparateur et je stocke chaque division dans différentes variables.

while IFS=":" read A B C D E F G
do
    echo ${A}
    echo ${B}
    echo ${C}
    echo ${D}
    echo ${E}
    echo ${F}
    echo ${G}
done < /etc/passwd

J'ai affiché une seule ligne divisée dans la capture d'écran ci-dessus en tenant compte de la taille de la capture d'écran.

Lignes vides sous Linux

Les lignes vides ne sont pas ignorées lorsque vous faites une boucle dans le contenu du fichier. Pour démontrer cela, j'ai créé un exemple de fichier avec le contenu ci-dessous. Il y a 4 lignes et quelques lignes vides, des espaces de début et de fin, des caractères de tabulation sur la ligne 2 et quelques caractères d'échappement (\n et \t).

while read LREAD
do
    echo ${LREAD}
done < testfile

Voir le résultat, la ligne vide n'est pas ignorée. Il est également intéressant de noter comment les espaces blancs sont supprimés par la commande read. Un moyen simple d'ignorer les lignes vides lors de la lecture du contenu du fichier consiste à utiliser l'opérateur de test avec l'indicateur -z qui vérifie si la longueur de la chaîne est nulle. Répétons maintenant le même exemple mais cette fois avec un opérateur de test.

while read LREAD
do
    if [[ ! -z $LREAD ]]
    then
        echo ${LREAD} 
    fi
done < testfile

Désormais, à partir de la sortie, vous pouvez voir que les lignes vides sont ignorées.

Personnages d'évasion

Les caractères d'échappement comme \n, \t, \c ne seront pas imprimés lors de la lecture d'un fichier. Pour démontrer cela, j'utilise le même exemple de fichier qui comporte quelques caractères d'échappement.

while read LREAD
do
    echo ${LREAD}
done < testfile

Vous pouvez voir dans la sortie que les caractères d'échappement ont perdu leur signification et que seuls n et t sont imprimés au lieu de \n et \t . Vous pouvez utiliser -r pour empêcher l'interprétation d'une barre oblique inverse.

while read -r LREAD
do
    echo ${LREAD}
done < testfile

C'est tout pour cet article. Nous serions ravis de recevoir votre réponse si vous avez des commentaires ou des conseils. Vos commentaires nous aident à créer un meilleur contenu. Continuez à lire et continuez à soutenir.