#!/bin/bash
# redir2.sh

if [ -z "$1" ]
then
  Fichier=noms.donnees       # par défaut, si aucun fichier n'est spécifié.
else
  Fichier=$1
fi  
#+ Fichier=${1:-noms.donnees}
#  peut remplacer le test ci-dessus (substitution de paramètres).

compteur=0

echo

while [ "$nom" != Smith ]  # Pourquoi la variable $nom est-elle entre guillemets?
do
  read nom                 # Lit à partir de $Fichier, plutôt que de stdin.
  echo $nom
  let "compteur += 1"
done &lt;"$Fichier"           # Redirige stdin vers le fichier $Fichier. 
#    ^^^^^^^^^^^^

echo; echo "$compteur noms lus"; echo

exit 0

#  Notez que dans certains vieux langages de scripts shells,
#+ la boucle redirigée pourrait tourner dans un sous-shell.
# Du coup, $compteur renverrait 0, la valeur initialisée en dehors de la boucle.
#  Bash et ksh évitent de lancer un sous-shell *autant que possible*,
#+ de façon à ce que ce script, par exemple, tourne correctement.
# Merci à Heiner Steven pour nous l'avoir indiqué.

# Néanmoins...
#  Bash *peut* quelque fois commencer un sous-shell dans une boucle "while"
#+ alimentée par un *tube*,
#+ à distinguer d'une boucle "while" *redirigée*.

abc=hi
echo -e "1\n2\n3" | while read l
     do abc="$l"
        echo $abc
     done
echo $abc

#  Merci à Bruno de Oliveira Schneider pour avoir démontré ceci
#+ avec l'astuce de code ci-dessus.
#  Et merci à Brian Onn pour avoir corriger une erreur dans un commentaire.
