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

不确定是否应该将它放在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不为空,但实际包含预期值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值