不确定是否应该将它放在stackoverflow或unix.stackexchange上,但我在这里发现了一些类似的问题,所以这里就来了。
我正在尝试创建一个由.bashrc调用的脚本,它允许我基于一次击键选择两个选项中的一个。这通常不难,但我希望这两个选项对应的两个键是空格和回车键。
到目前为止,我得到的是:
#!/bin/bash
SELECT=""
while [["$SELECT" != $'\x0a' &&"$SELECT" != $'\x20' ]]; do
echo"Select session type:"
echo"Press to do foo"
echo"Press 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 to start/resume a screen session
Press for a regular ssh session
Debug//0
Select session type:
Press to start/resume a screen session
Press for a regular ssh session
Debug//0
Select session type:
Press to start/resume a screen session
Press for a regular ssh session
Debug//1
Select session type:
Press to start/resume a screen session
Press for a regular ssh session
Debug/x/1
因此,输入和空格都会导致一个空的选择。无法区分这两者。我试图在阅读选项中添加-d'd',但这没有帮助。也许有人能给我指明正确的方向。
bash版本将是4.2 btw。
相关的unix.stackexchange.com/questions/179191/…
尝试将读取分隔符设置为空字符串,然后检查内置$reply变量:
read -d'' -s -n1
由于某种原因,我不能让它指定一个变量。
即使不更改带有-d的分隔符,也能很好地工作。Enter和Space都被正确检测到。
我们可能有不同口味的read。如果我漏掉-d",我就得不到回车键。
我只是注意到我们分别使用-n和-n。这一定是原因,当用-n换行符指定长度时,不会特别处理它。
我本来打算用-n选项进行测试,但我的阅读没有。
#!/bin/bash
SELECT=""
# prevent parsing of the input line
IFS=''
while [["$SELECT" != $'\x0a' &&"$SELECT" != $'\x20' ]]; do
echo"Select session type:"
echo"Press to do foo"
echo"Press 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声明更改为:
IFS= read -s -n 1 SELECT
输入enter时,需要一个空字符串而不是$'\x0a'。
这同样有效,并且只为read命令设置ifs基本上是一个干净的解决方案。我仍然把普纳姆希尔的标记为正确的,因为它不能通过改变的假设产生意外的副作用。尽管如此,还是投了赞成票!btw,当发送enter时,-n而不是-n select不为空,但实际包含预期值。