bash脚本 - 读取单击键,包括特殊键输入和空格

时间:2014-04-03 15:56:09

标签: linux bash shell special-characters keystroke

不确定我是否应该将它放在stackoverflow或unix.stackexchange上,但我在这里找到了一些similar questions,所以就这样了。

我试图创建一个由.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&#39; D&#39;阅读选项,但没有帮助。也许有人可以指出我正确的方向。

bash版本是4.2 btw。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

read -d'' -s -n1

出于某种原因,我无法指定变量。

答案 2 :(得分:2)

read有几件与此相关的内容:

  • 它读取一行
  • 与分词
  • 一样,该行被拆分为字段

由于你正在阅读一个字符,这意味着输入 Enter 将导致一个空变量。

此外,默认情况下,单词拆分规则,输入 Space 也会产生一个空变量。好消息是你可以通过设置IFS来处理这部分。

将您的read声明更改为:

IFS= read -s -n 1 SELECT
输入 Enter 时,

并期望一个空字符串而不是$'\x0a'