2014-01-09 64 views
0

我有一個循環,我想打破任何用戶輸入。Bash:用`read`捕獲換行符

人爲的例子 - 計數到10時的計時器:

counter=10 
while ((counter > 0)) && [[ -z $input ]]; do 
    printf '\rRestart in %s seconds' "$counter" 
    read -n 1 -t 1 input 
    ((counter--)) 
done 
echo "Completed" 

這適用於適當的所有用戶輸入除了Enter,我完全相信,Enter將是最常見的輸入。

如何使用Bash的read命令捕獲Enter

+0

修復了語法 - 給定的示例代碼實際上並沒有工作 - 也使它遵循一些約定。 –

+0

@CharlesDuffy謝謝! –

+0

我錯過了第一遍格式化/約定修正中的主要內容 - 在printf的第一個參數中不應該使用參數擴展(因爲它可能會導致格式字符串無效)而不會出現情有可原的情況。在隨後的傳球中補丁。 –

回答

2

泰爾閱讀使用NUL作爲分隔符:

IFS='' read -r -d '' -n 1 -t 1 input 

所以,完整的上下文:

counter=10; input='' 
while ((counter > 0)) && [[ -z $input ]]; do 
    printf "\rRestart in %s seconds" "$counter" 
    IFS='' read -n 1 -t 1 -d '' input 
    ((counter--)) 
done 
+0

這回答了我很多其他問題。謝謝! –

4

bash的手冊說,read返回成功(返回代碼0),除非它超時。那麼怎麼樣:

for ((counter=10 ; counter > 0 ; counter--)); do 
    printf "\rRestart in %s seconds " $counter 
    read -n 1 -t 1 input && break 
done 
echo "Completed" 
+0

+1我的想法正確 –

+0

+1 - 這是比我提供的OP更真實的解決方案。另一方面,它並沒有實際演示如何通過閱讀來捕獲換行符,這是別人誰點擊搜索結果可能需要回答的問題,所以我傾向於打電話給接受答案國旗正確授予。 :) –

+0

...有一些小問題,第二次看 - 「計數器」與「COUNTER」,這保留了在格式字符串中執行字符串替換的先前代碼中的錯誤做法。 –