2010-10-21 29 views
1

我使用UNIX中的Bourne shell和正在运行到以下问题:为什么我无法在UNIX while循环内正确读取用户输入?

#!/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等待用户输入?

回答

2

这是因为你询问程序从文件file.txt阅读:

done <file.txt 

也像你在这里有一个错字:

if [ $x = "true" ] 
    ^^ 

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

0

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

2

标准输入由<file.txtwhile年底重定向... done <file.txt影响到整个while循环,包括read choice还有read line。这不仅仅是没有停止 - 它也在消耗一行输入文件。

下面就来解决这个问题的一种方法......

您可以通过使用有些模糊的(甚至是外壳的标准)保存原来的标准输入:这将打开文件描述符3

exec 3<&0 

请参阅原始文件描述符0,这是原始标准输入。 (文件描述符0,1和2分别是标准输入,输出和错误)然后,您可以通过执行read choice <&3来仅将read choice的输入重定向为来自文件描述符3。

完整的工作剧本(我不知道在哪里x本来是要来的,所以我只是bodged它,使其工作):

#!/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