108 votes

Lire l'entrée dans bash dans une boucle while

Je vais avoir un script bash qui est quelque chose comme suit,

 cat filename | while read line
do
    read input;
    echo $input;
done
 

mais il est clair que cela ne me donne pas le bon résultat, car lorsque je lis dans la boucle while, il essaie de lire le fichier filename en raison de la redirection possible des E / S.

Une autre façon de faire la même chose?

116voto

dank Points 244

Lire à partir du terminal de contrôle:

 read input </dev/tty
 

plus d'infos: http://compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop

60voto

Gordon Davisson Points 22534

Vous pouvez rediriger le stdin normal par le biais de l'unité 3 pour le conserver dans le pipeline:

 { cat notify-finished | while read line; do
    read -u 3 input
    echo "$input"
done; } 3<&0
 

BTW, si vous utilisez vraiment cat cette façon, remplacez-le par une redirection et les choses deviendront encore plus simples:

 while read line; do
    read -u 3 input
    echo "$input"
done 3<&0 <notify-finished
 

3voto

dimba Points 5389

Essayez de changer la boucle comme ceci:

 for line in $(cat filename); do
    read input
    echo $input;
done
 

Test de l'unité:

 for line in $(cat /etc/passwd); do
    read input
    echo $input;
    echo "[$line]"
done
 

3voto

Hai Vu Points 10359

On dirait que vous avez lu deux fois, la lecture dans la boucle while n'est pas nécessaire. De plus, vous n'avez pas besoin d'appeler la commande cat:

 while read input
do
    echo $input
done < filename
 

-6voto

Munchk1n Points 1
echo "Enter the Programs you want to run:"
> ${PROGRAM_LIST}
while read PROGRAM_ENTRY
do
   if [ ! -s ${PROGRAM_ENTRY} ]
   then
      echo ${PROGRAM_ENTRY} >> ${PROGRAM_LIST}
   else
      break
   fi
done

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X