bash脚本 – 读取单个按键,包括特殊的键入和空格

不知道如果我应该把这个在stackoverflow或unix.stackexchange,但我在这里发现了一些类似的 问题 ,所以在这里。

我试图创build一个脚本,通过.bashrc调用,允许我select基于一个按键的两个选项之一。 这通常不会很难,但是我希望对应于这两个选项的两个键是空格并进入。

这是我到目前为止:

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

下面的输出是我得到的,如果我按下input,空格,退格键和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 

所以input和空格都会导致一个空的SELECT。 没办法区分二者。 我尝试在读取选项中添加-d“D”,但这并没有帮助。 也许有人可以把我指向正确的方向。

bash版本将是4.2 btw。

Solutions Collecting From Web of "bash脚本 – 读取单个按键,包括特殊的键入和空格"

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

 read -d'' -s -n1 

出于某种原因,我无法让它工作指定一个变量。

 #!/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将导致一个空的变量。

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

将您的read说明更改为:

 IFS= read -s -n 1 SELECT 

并且在输入Enter时需要一个空字符串而不是$'\x0a'