2014-04-03 81 views
8

不知道是否應該將它放在stackoverflow或unix.stackexchange上,但我在這裏發現了一些similarquestions,所以在這裏。bash腳本 - 讀取包含特殊按鍵的單個按鍵輸入和空格

我試圖創建一個腳本,通過.bashrc調用,它允許我根據一個按鍵選擇兩個選項之一。這通常不會很難,但我希望兩個選項對應的兩個鍵都是空格並進入。

這裏就是我有這麼遠:

#!/bin/bash 

SELECT="" 
while [[ "$SELECT" != $'\x0a' && "$SELECT" != $'\x20' ]]; do 
    echo "Select session type:" 
    echo "Press <Enter> to do foo" 
    echo "Press <Space> to do bar" 
    read -s -N 1 SELECT 
    echo "Debug/$SELECT/${#SELECT}" 
    [[ "$SELECT" == $'\x0a' ]] && echo "enter" # do foo 
    [[ "$SELECT" == $'\x20' ]] && echo "space" # do bar 
done 

下面的輸出是我所得到的,如果我按回車,空格,退格鍵和X:

:~$ bin/sessionSelect.sh 
Select session type: 
Press <Enter> to start/resume a screen session 
Press <Space> for a regular ssh session 
Debug//0 
Select session type: 
Press <Enter> to start/resume a screen session 
Press <Space> for a regular ssh session 
Debug//0 
Select session type: 
Press <Enter> to start/resume a screen session 
Press <Space> for a regular ssh session 
Debug//1 
Select session type: 
Press <Enter> to start/resume a screen session 
Press <Space> for a regular ssh session 
Debug/x/1 

所以進入和空間的結果一個空的SELECT。無法區分這兩者。我試圖在讀取選項中添加-d'D',但這並沒有幫助。也許有人可以指出我正確的方向。

bash版本將是4.2 btw。

+0

相關https://unix.stackexchange.com/questions/179191/bashscript-to-detect-right-arrow-key-being-pressed –

回答

3

嘗試讀取分隔符設置爲空字符串,然後檢查內置$ REPLY變量:

read -d'' -s -n1 

出於某種原因,我無法得到它的工作指定變量。

+0

即使不用-d改變分隔符,這也可以很好地工作。正確檢測到輸入和空格。 –

+1

我們可能已經有了'read'的不同口味。如果我放棄了-d'',我沒有得到輸入密鑰。 –

+0

我只注意到我們分別使用-n和-N。這一定是其中的原因,當用-N指定長度時,不會特別處理新行。 –

3
#!/bin/bash 
SELECT="" 
# prevent parsing of the input line 
IFS='' 
while [[ "$SELECT" != $'\x0a' && "$SELECT" != $'\x20' ]]; do 
    echo "Select session type:" 
    echo "Press <Enter> to do foo" 
    echo "Press <Space> to do bar" 
    read -s -N 1 SELECT 
    echo "Debug/$SELECT/${#SELECT}" 
    [[ "$SELECT" == $'\x0a' ]] && echo "enter" # do foo 
    [[ "$SELECT" == $'\x20' ]] && echo "space" # do bar 
done 
2

有一個關於read兩件事是相關這裏:

  • 它讀取一行
  • 線被分成領域與分詞

由於您正在閱讀一個字符,這意味着輸入輸入將導致一個空變量。

此外,默認規則爲分詞,輸入空間也將導致一個空的變量。好消息是你可以通過設置IFS來處理這部分。進入輸入

IFS= read -s -n 1 SELECT 

,並期望一個空字符串,而不是$'\x0a'

更改read語句。

+0

這也適用於設置IFS僅用於讀取命令基本上是清理解決方案。我仍然認爲putnamhill是正確的,因爲它不會通過改變的IFS產生意外的副作用。 upvoted雖然! 順便說一下,用-N代替-n發送回車時SELECT不爲空,但實際上包含期望值。 –