2013-06-25 33 views
2

在bash中,當[返回]鍵被擊中時,是否有可能退出不等待用戶輸入的循環?當[返回]命中時打破一個bash循環

這裏是我所說的那種循環。關鍵是[q]。我希望它是[Return]。

#!/bin/bash 

stty -echo -icanon time 0 min 0 # Don't wait when read the input 

i=1 

while [ 1 ]; do 

    echo -ne "$i\r" 

    ((i+=1)) 

    read key 

    if [ "$key" == "q" ]; then break; fi # If [q] is hit, get out of the loop 

done 

stty sane # Come back to the classic behavior 

exit 0 
+0

在'vim'中,例如你可以做'',然後打'',你應該看到一個'^ M'字符。這是你想比較的那個。 – Jite

+0

你好,實際上@Brice是正確的,當他說當$'鍵在'讀'命令期間只輸入[返回]時是無效的。但問題是,因爲我的腳本的第三行(stty -echo ...),即使用戶沒有輸入任何內容,$ key在'if'位置是無效的。 恐怕沒有辦法解決這個問題...... – taalf

回答

2

要檢查用戶按下正是返回(亦稱輸入),而不是像按Ctrl + d,只需檢查退出代碼是零(因爲按Ctrl + dCtrl鍵 + ç將導致非零退出代碼),並且所述鍵是空的:

if [ $? -eq 0 ] && [ -z "$key" ] 
then 
    break 
fi 
+0

你做到了! :D:D:D 非常感謝! :) – taalf

0

如果用戶類型<return>,而無需輸入任何東西,$key將是一個空字符串。

只是檢查空字符串太:

if [ -z "$key" ]; then break; fi 

the man page-z告訴檢查一個零長度字符串

+0

'-z'不會告訴'if'來檢查一個零長度的字符串。這是'test'命令檢查它,並返回真/假哪個'if'然後執行。小而重要的差異。 – Jite

+0

嗨brice,問題是,由於第一條註釋行,如果用戶沒有打任何鍵,$ key是一個無效的字符串。所以當它返回或不返回時,沒有區別。 – taalf

+0

@brice如果使用'[['或'''(甚至'test'或'grep')並不重要,'if'只是檢查下面的命令是否返回零。 – l0b0