关于linux:bash脚本 – 读取单击按键,包括特殊键输入和空格

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

不确定是否应该将它放在stackoverflow或unix.stackexchange上,但我在这里发现了一些类似的问题,所以这里就来了。

我正在尝试创建一个由.bashrc调用的脚本,它允许我基于一次击键选择两个选项中的一个。这通常不难,但我希望这两个选项对应的两个键是空格和回车键。

到目前为止,我得到的是:

1
2
3
4
5
6
7
8
9
10
11
12
#!/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键,将得到以下输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
:~$ 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

因此,输入和空格都会导致一个空的选择。无法区分这两者。我试图在阅读选项中添加-d'd',但这没有帮助。也许有人能给我指明正确的方向。

bash版本将是4.2 btw。


尝试将读取分隔符设置为空字符串,然后检查内置$reply变量:

1
read -d'' -s -n1

由于某种原因,我不能让它指定一个变量。


1
2
3
4
5
6
7
8
9
10
11
12
13
#!/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


关于read,这里有一些相关的内容:

  • 它读一行
  • 行被拆分为字段,就像单词拆分一样。

由于您正在读取一个字符,这意味着输入enter将导致一个空变量。

此外,在默认的分词规则中,输入spaceakbd也会导致一个空变量。好消息是,您可以通过设置IFS来处理这一部分。

将您的read声明更改为:

1
IFS= read -s -n 1 SELECT

输入enter时,需要一个空字符串而不是$'\x0a'