lors de l’écriture de scripts Bash, vous vous retrouverez parfois dans des situations où vous devez lire un fichier ligne par ligne. Par exemple, vous pouvez avoir un fichier texte contenant des données qui doivent être traitées par le script.
Dans ce tutoriel, nous allons discuter de la façon de lire un fichier ligne par ligne dans Bash.,
la Lecture d’un Fichier ligne Par Ligne de la Syntaxe #
La plupart syntaxe générale pour lire un fichier ligne par ligne, est comme suit:
while IFS= read -r line; do printf '%s\n' "$line"done < input_file
ou l’équivalent d’une seule ligne de la version:
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
Comment ça marche?
Le fichier d’entrée (input_file
) est le nom du fichier redirigé vers la boucle while. La commanderead
traite le fichier ligne par ligne, assignant chaque ligne à la variableline
. Une fois que toutes les lignes sont traitées, la boucle while se termine.,
par défaut, la commande read
interprète la barre oblique inverse comme un caractère d’échappement et supprime tous les espaces blancs de début et de fin, ce qui peut parfois provoquer un comportement inattendu. Pour désactiver l’échappement de la barre oblique inverse, nous appelons la commande avec l’option-r
, et pour désactiver le rognage, le séparateur de champ interne (IFS
) est effacé.
nous utilisons au lieu deecho
pour rendre le code plus portable et éviter les comportements indésirables., Par exemple, si la ligne contient des valeurs telles que « -e”, elle sera traitée comme une option echo.
lecture D’un fichier Ligne par ligne exemples #
examinons l’exemple suivant. Supposons que nous ayons un fichier nommé distros.txt
contenant une liste de certaines des distributions Linux les plus populaires, et leurs gestionnaires de paquets séparés par une virgule (,
):
Ubuntu,aptDebian,aptCentOS,yumArch Linux,pacmanFedora,dnf
Pour lire le fichier ligne par ligne, vous exécutez le code suivant dans votre terminal:
while IFS= read -r line; do printf '%s\n' "$line"done < distros.txt
Le code lit le fichier en ligne, attribue à chaque ligne à une variable, et l’imprime. Fondamentalement, vous verriez la même sortie que si vous affichiez le contenu du fichier en utilisant la commande cat
.
Que faire si vous voulez imprimer seulement les distributions qui utilisent apt?, Une façon serait d’utiliser l’instruction if
et de vérifier si la ligne contient la sous-chaîne apt :
while IFS= read -r line; do if ]; then printf '%s\n' "$line" fidone < distros.txt
Ubuntu,aptDebian,apt
lors de la lecture d’un fichier ligne par ligne, vous pouvez également passer plus d’une variable 0b373a4853″>
commande, qui divisera la ligne en champs basés surIFS
. Le premier champ est affecté à la première variable, le second à la deuxième variable, etc. S’il y a plus de champs que de variables, les champs restants sont affectés à la dernière variable.,
Dans l’exemple suivant, nous avons mis en IFS
virgule (,
) et de passer deux variables distro
et pm
à la balise read
commande.,tout ce qui va du début de la ligne jusqu’à la première virgule sera affecté à la première variable (distro
), et le reste de la ligne sera affecté à la deuxième variable (pm
):
while IFS=, read -r distro pm; do printf '%s is the package manager for %s\n' "$pm" "$distro"done < distros.txt
apt is the package manager for Ubuntuapt is the package manager for Debianyum is the package manager for CentOSpacman is the package manager for Arch Linuxdnf is the package manager for Fedora
méthodes alternatives de lecture de fichiers #
en utilisant une substitution de processus #
la substitution de processus est une fonctionnalité qui vous permet d’utiliser la commande output from en tant que Fichier:
while IFS= read -r line; do printf '%s\n' "$line"done < <(cat input_file )
en utilisant une chaîne here #
here string document ., La chaîne (cat input_file )
conserve les sauts de ligne:
while IFS= read -r line; do printf '%s\n' "$line"done <<< $(cat input_file )
en utilisant le descripteur de fichier #
Vous pouvez également fournir l’entrée à la boucle en utilisant un descripteur de fichier:
while IFS= read -r -u9 line; do printf '%s\n' "$line"done 9< input_file
lorsque vous travaillez avec des descripteurs de fichiers , utilisez un nombre compris entre 4 et 9 pour éviter les conflits avec les descripteurs de fichiers internes du shell.
Conclusion #
dans Bash, nous pouvons lire un fichier ligne par ligne en utilisant une boucle while et la commanderead
.
Laisser un commentaire