2016-04-07 172 views
1

我試圖做一個while循環。 如果輸入用戶名稱,則在輸入亂碼或用戶手指時,此循環應回顯「再次嘗試或輸入退出以退出」。Bash while循環

echo Please enter a user name to find. 
read username 
done_fn() 
{ 
    finger $username 
    exit 0 
}  
continue_fn() 
{ 
    echo 'try again or type exit to quit' 
    read exitvar 
} 

grep $username /etc/passwd >/dev/null 
while [ $? -eq 0 ] 
do 
    done_fn 
done 

exitvar=quit 

until [ $exitvar = exit ] 
do 
    continue_fn 
    done 
while [ -u $exitvar ] 
do 
    done_fn 
done 

這是我到目前爲止得到的一切。每當我在'再試一次或輸入exit退出'之後輸入用戶名,它就會再次回顯。我希望它能指示用戶而不是再次回顯。我看了很多地方,找不到答案。

預先感謝您。

+0

你能分享你得到的輸出嗎?顯示錯誤的行爲? –

+1

學習使用shell調試/跟蹤功能,並用'set -vx'和'set + vx'關閉有問題的行關閉。你會看到你的代碼顯示,然後執行。前面加上+的行顯示了變量名稱取代了什麼值。在調試模式下,所有引用都由調試/跟蹤功能「簡化」爲單引號。你應該立刻看到你的問題是在'grep'後面跟着'while'。祝你好運! – shellter

+0

一旦我運行它並鍵入一個正確的用戶,它會指示用戶。如果我輸入亂碼,輸出'再試一次或輸入exit退出',一旦我嘗試輸入一個正確的用戶,它會繼續輸出'再試一次或輸入exit退出'。 username_loop.sh 請輸入用戶名稱以查找。 jmalley2 登錄:jmalley2姓名:Joseph Malley username_loop.sh 請輸入用戶名以便查找。 asdfasdfasfasf 再試一次或鍵入exit退出 jmalley2 再試一次或鍵入exit退出 –

回答

1

你可以試試這個:

typeset u="John Doe" 
while ! grep -q "^$u:" /etc/passwd 
do 
    echo -n "username? " 
    read u 
    if [[ $u = "q" ]] 
    then 
      exit 
    fi 
done 
finger $u 
+0

你從一個你肯定不會在/ etc/passwd中找到的名字開始。然後,直到您在/ etc/passwd的第一個字段中找到輸入的名稱(^ :),您繼續詢問新名稱。如果你終於找到一個名字,只需要指責它。 – Dandorid

+0

你可以把'read'放在'while'中,所以你不必以一個sentinel值開始。另外我猜'手指'應該進入循環。 – tripleee

+0

該循環用於查找有效的用戶名,僅此而已。如果用戶名是'q',那麼完全退出。如果找到有效的用戶名,則執行最後的「finger」語句,然後終止腳本。 'read'已經在'while'中,手指不在那裏,因爲這不在原始請求中。 – Dandorid

0
echo Please enter a user name to find. 
read username 
donev2_fn() 
{ 
     finger $exitvar 
     exit 0 
} 
done_fn() 
{ 
     finger $username 
     exit 0 
} 
continue_fn() 
{ 
     echo 'try again or type exit to quit' 
     read exitvar 
     grep $exitvar /etc/passwd >/dev/null 
     if [ $? -eq 0 ] 
       then 
         donev2_fn 
     fi 
} 
grep $username /etc/passwd >/dev/null 
while [ $? -eq 0 ] 
     do 
       done_fn 
done 
exitvar=quit 
until [ $exitvar = exit ] 
     do 
       continue_fn 
done 

我想通了。我不得不在其中添加一個額外的功能。感謝您的幫助。