2014-01-21 55 views
6

我需要監聽倒數計時器循環中的任何按鍵。如果有任何按鍵被按下,則倒數計時器應該跳出循環。除了輸入鍵之外,這大部分工作只是使倒數計時器變得更快。Bash腳本倒數計時器需要檢測任何密鑰才能繼續

#!/bin/bash 
for ((i=30; i>0; i--)); do 
    printf "\rStarting script in $i seconds. Hit any key to continue." 
    read -s -n 1 -t 1 key 
    if [[ $key ]] 
    then 
     break 
    fi 
done 
echo "Resume script" 

我似乎無法找到任何關於如何檢測在線任何地方輸入密鑰的例子。

回答

5

我認爲根據read的返回碼,有一個解決此問題的方法。從man頁面read

The return code is zero, unless end-of-file is encountered, read times out, 
or an invalid file descriptor is supplied as the argument to -u. 

timeout的返回碼似乎是142 [證實了Fedora 16]

因此,該腳本可以被修改,

#!/bin/bash 
for ((i=30; i>0; i--)); do 
    printf "\rStarting script in $i seconds. Hit any key to continue." 
    read -s -n 1 -t 1 key 
    if [ $? -eq 0 ] 
    then 
     break 
    fi 
done 
echo "Resume script" 
+0

順便說一句「打任何關鍵」的好工作。簡單! –

1

問題是read會默認認爲換行符是一個分隔符。

IFS設置爲空以避免讀取upto的分隔符。

說:

IFS= read -s -N 1 -t 1 key 

,而不是和你在命中read期間,輸入鍵得到預期的行爲。

+0

不幸的是這導致了我得到的相同行爲。回車鍵將繼續下一個循環迭代。我正在尋找類似的解決方案給你,但我從來沒有找到一個。 –