在while循环中读取bash中的输入

时间:2011-07-30 13:22:39

标签: bash while-loop

我正在使用bash脚本,如下所示,

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

但是这显然没有给我正确的输出,因为我在while循环中读取它会尝试从文件文件名中读取,因为可能的I / O重定向。

还有其他方法吗?

6 个答案:

答案 0 :(得分:94)

从控制终端设备读取:

read input </dev/tty

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

答案 1 :(得分:51)

您可以将常规stdin重定向到单元3,以使其保持在管道中:

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

顺便说一句,如果您真的以这种方式使用cat,请将其替换为重定向,事情变得更加容易:

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

或者,您可以在该版本中交换stdin和unit 3 - 使用单元3读取文件,然后只保留stdin:

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

答案 2 :(得分:6)

尝试改变这样的循环:

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

单元测试:

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

答案 3 :(得分:5)

看起来你读了两次,不需要在while循环中读取。此外,您不需要调用cat命令:

while read input
do
    echo $input
done < filename

答案 4 :(得分:1)

我发现该参数-u已读取。

“-u 1”表示“从标准输入中读取”

while read -r newline; do
    ((i++))
    read -u 1 -p "Doing $i""th file, called $newline. Write your answer and press Enter!"
    echo "Processing $newline with $REPLY" # united input from two different read commands.
done <<< $(ls)

答案 5 :(得分:-5)

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