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 |
关于
- 它读一行
- 行被拆分为字段,就像单词拆分一样。
由于您正在读取一个字符,这意味着输入enter将导致一个空变量。
此外,在默认的分词规则中,输入spaceakbd也会导致一个空变量。好消息是,您可以通过设置
将您的
1 | IFS= read -s -n 1 SELECT |
输入enter时,需要一个空字符串而不是