J'ai le fichier .txt suivant:
Marco
Paolo
Antonio
Je veux le lire ligne par ligne, et pour chaque ligne je veux assigner une valeur de ligne .txt à une variable. En supposant que ma variable est $name
, le flux est le suivant:
$name
= "Marco"$name
$name
= "Paolo"Ce qui suit (enregistrer sous rr.sh
) lit un fichier transmis comme argument ligne par ligne:
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
done < "$1"
Explication:
IFS=''
(ou IFS=
) empêche le rognage des espaces de début et de fin.-r
empêche l'interprétation des échappements de barre oblique inverse.|| [[ -n $line ]]
empêche la dernière ligne d'être ignorée si elle ne se termine pas par un \n
(puisque read
renvoie un code de sortie différent de zéro lorsqu'il rencontre EOF).Exécutez le script comme suit:
chmod +x rr.sh
./rr.sh filename.txt
....
Je vous encourage à utiliser le drapeau -r
pour read
qui signifie:
-r Do not treat a backslash character in any special way. Consider each
backslash to be part of the input line.
Je cite de man 1 read
.
Une autre chose est de prendre un nom de fichier comme argument.
Voici le code mis à jour:
#!/usr/bin/bash
filename="$1"
while read -r line; do
name="$line"
echo "Name read from file - $name"
done < "$filename"
L'utilisation du modèle Bash suivant devrait vous permettre de lire une valeur à la fois à partir d'un fichier et de le traiter.
while read name; do
# Do what you want to $name
done < filename
#! /bin/bash
cat filename | while read LINE; do
echo $LINE
done
De nombreuses personnes ont publié une solution sur-optimisée. Je ne pense pas que ce soit incorrect, mais je pense humblement qu’une solution moins optimisée serait souhaitable pour permettre à tout le monde de comprendre facilement comment cela fonctionne. Voici ma proposition:
#!/bin/bash
#
# This program reads lines from a file.
#
end_of_file=0
while [[ $end_of_file == 0 ]]; do
read -r line
# the last exit status is the
# flag of the end of file
end_of_file=$?
echo $line
done < "$1"
Utilisation:
filename=$1
IFS=$'\n'
for next in `cat $filename`; do
echo "$next read from $filename"
done
exit 0
Si vous avez défini IFS
différemment, vous obtiendrez des résultats impairs.
Si vous devez traiter à la fois le fichier d'entrée et l'entrée utilisateur (ou tout autre élément de stdin), utilisez la solution suivante:
#!/bin/bash
exec 3<"$1"
while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do
read -p "> $line (Press Enter to continue)"
done
Basé sur la réponse acceptée et sur le tutoriel de redirection bash-hackers .
Ici, nous ouvrons le descripteur de fichier 3 pour le fichier transmis comme argument de script et indiquons à read
d'utiliser ce descripteur en tant qu'entrée (-u 3
). Ainsi, nous laissons le descripteur d’entrée par défaut (0) attaché à un terminal ou à une autre source d’entrée, capable de lire les entrées de l’utilisateur.
Pour un traitement correct des erreurs:
#!/bin/bash
set -Ee
trap "echo error" EXIT
test -e ${FILENAME} || exit
while read -r line
do
echo ${line}
done < ${FILENAME}
Utiliser l’outil IFS (séparateur de champs interne) dans bash, définit le caractère à utiliser pour séparer les lignes en jetons, inclut par défaut <tab>/<espace>/<newLine>
étape 1: Chargez les données du fichier et insérez-les dans la liste:
# declaring array list and index iterator
declare -a array=()
i=0
# reading file in row mode, insert each line into array
while IFS= read -r line; do
array[i]=$line
let "i++"
# reading from file path
done < "<yourFullFilePath>"
étape 2: maintenant, itérez et imprimez le résultat:
for line in "${array[@]}"
do
echo "$line"
done
index spécifique à l'écho dans un tablea: Accéder à une variable dans un tableau:
echo "${array[0]}"
Ce qui suit va simplement imprimer le contenu du fichier:
cat $Path/FileName.txt
while read line;
do
echo $line
done