簡體   English   中英

bash腳本 - 讀取單擊鍵,包括特殊鍵輸入和空格

[英]bash scripting - read single keystroke including special keys enter and space

不確定我是否應該將它放在stackoverflow或unix.stackexchange上,但我在這里發現了一些類似的 問題 ,所以在這里。

我正在嘗試創建一個由.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

如果我按下enter,space,backspace和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。

#!/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

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

read -d'' -s -n1

出於某種原因,我無法指定變量。

這里有一些關於read

  • 它讀取一行
  • 與分詞一樣,該行被分割為字段

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

此外,默認情況下,單詞拆分規則,輸入Space也會產生一個空變量。 好消息是你可以通過設置IFS來處理這個部分。

將您的read聲明更改為:

IFS= read -s -n 1 SELECT

並且在輸入Enter時期望一個空字符串而不是$'\\x0a'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM