Question Lire un fichier ligne par ligne en affectant la valeur à une variable


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. Supposons que ma variable est $name, le flux est:

  • Lire la première ligne du fichier
  • Attribuer $name = "Marco"
  • Faire des tâches avec $name
  • Lire la deuxième ligne du fichier
  • Attribuer $name = "Paolo"

524
2018-06-07 09:49


origine


Réponses:


Les éléments suivants (enregistrer sous rr.sh) lit un fichier passé en 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 les espaces avant / arrière d'être rognés.
  • -r empêche les échappements antislash d'être interprétés.
  • || [[ -n $line ]] empêche la dernière ligne d'être ignorée si elle ne se termine pas par \n (depuis 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

....


969
2018-06-07 09:53



Je vous encourage à utiliser le -r drapeau pour read Qui veut dire:

-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"

252
2018-06-07 10:24



L'utilisation du modèle Bash suivant devrait vous permettre de lire une valeur à la fois à partir d'un fichier et de la traiter.

while read name
do
    # Do what you want to $name
done < filename

103
2018-06-07 09:55



#! /bin/bash
cat filename | while read LINE
do
echo $LINE
done

50
2018-01-12 11:25



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 sera 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"

17
2017-10-16 10:30



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 étranges.


16
2018-04-17 20:40



Pour une gestion correcte des erreurs:

#!/bin/bash

set -Ee    
trap "echo error" EXIT    
test -e ${FILENAME} || exit
while read -r line
do
    echo ${line}
done < ${FILENAME}

6
2017-12-21 19:49



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 de bash-hackers.

Ici, nous ouvrons le descripteur de fichier 3 pour le fichier passé comme argument de script et disons read utiliser ce descripteur comme 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.


5
2018-02-01 12:58