在一个while循环中读取bash中的input

我有一个bash脚本,就像下面的东西,

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

但是这显然没有给我正确的输出,因为当我在while循环中读取时,由于可能的I / Oredirect,它尝试从文件的文件名中读取数据。

还有其他的方法吗?

从控制terminal设备读取:

 read input </dev/tty 

更多信息: http : //compgroups.net/comp.unix.shell/Fixing-stdin-inside-a-redirected-loop

你可以通过单元3redirect常规标准input,以保持它在pipe道内:

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

顺便说一句,如果你真的用这种方式使用cat ,用redirect代替它,事情变得更加容易:

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

尝试改变这样的循环:

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

unit testing:

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

它看起来像你读了两次,while循环内的读取是不需要的。 另外,您不需要调用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