为什么我不能在UNIX while循环中正确读取用户输入?

时间:2010-10-21 22:21:24

标签: unix shell

我在UNIX中使用bourne shell,遇到了以下问题:

#!/bin/sh


while read line
   do

  echo $line

  if [ $x = "true" ]
  then
        echo "something"
        read choice
        echo $choice
  else
        echo "something"
  fi

done <file.txt

我遇到的问题是UNIX不会等待读取命令中的用户输入 - 它只是通过而不是等待用户键入的内容。如何让unix等待用户输入?

3 个答案:

答案 0 :(得分:2)

这是因为您要求程序从文件file.txt中读取:

done <file.txt

此外看起来你有一个拼写错误:

if [ $x = "true" ]
     ^^

应为"$line"
另请注意",如果没有它们,如果从文件中读取的单词中有空格,则程序将会中断。

答案 1 :(得分:2)

<file.txt while末尾done <file.txt对标准输入的重定向会影响整个while循环,包括read choice as以及read line。它不仅没有停止 - 它也消耗了输入文件的一行。

这是解决问题的一种方法......

您可以使用有些模糊(甚至通过shell标准)来保存原始标准输入:

exec 3<&0

打开文件描述符3以引用原始文件描述符0,它是原始标准输入。 (文件描述符0,1和2分别是标准输入,输出和错误。)然后,您可以通过执行read choiceread choice <&3的输入重定向到来自文件描述符3。

完整的工作脚本(我不确定x应该来自哪里,所以我只是提出它以使其工作):

#!/bin/sh

x=true  # to make the example work

exec 3<&0

while read line
   do

  echo $line

  if [ $x = "true" ]
  then
        echo "something"
        read choice <&3
  else
        echo "something"
  fi

done <file.txt

答案 2 :(得分:0)

我没有做太多的shell脚本,但我认为“阅读选择”应该是“阅读$ choice”