2010-10-21 63 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