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

J’ai un script bash qui est quelque chose comme suivre,

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

mais cela ne me donne clairement pas le bon résultat, comme lorsque je lis dans la boucle while, il essaie de lire à partir du nom du fichier à cause de la redirection possible des E / S.

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

Lecture depuis le terminal de contrôle:

 read input  

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

Vous pouvez redirect le fichier stdin standard via 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 deviennent encore plus faciles:

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

Ou, vous pouvez échanger stdin et l'unité 3 dans cette version - lisez le fichier avec l'unité 3 et laissez stdin seul:

 while read line < &3; do # read & use stdin normally inside the loop read input echo "$input" done 3 

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 

On dirait que vous lisez 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 
 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