首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BASH问题:使用read,我可以捕获单个字符或箭头键(在键盘上)吗?

BASH问题:使用read,我可以捕获单个字符或箭头键(在键盘上)吗?
EN

Unix & Linux用户
提问于 2018-11-06 10:41:00
回答 1查看 1.7K关注 0票数 4

下面是我的策略:在BASH中工作,我已经构建了一个非常好的函数,它可以接受数组或任意数量的参数,并发出一个交互式菜单,可以上下箭头导航,最后用户点击enter,突出显示他们想要的菜单项(其输出要么是索引,要么是菜单项的值,这取决于启动菜单的方式):

这一切都很好;我呈现菜单,然后响应从用户的输入解析到一个read命令的不可见的提示符(在收集了3个字符之后自动触发):输入到$key变量中的输出,然后通过一个case语句运行,根据预测的可接受输入:\033[A (up) \033[A (down) "" (enter),这反过来触发所需的行为。

然而,我突然意识到,随着7+菜单项的引入(我们可能预先假定它不会超过10项),最好让用户点击所需菜单项的数字条目,这将在不提交项目的情况下突出显示该项目。

我的问题是:我的操作也很好,但是用户在输入所需的数字键(在本例中为5)之后,必须按enter键,以便read语句触发其效果,这要归功于我的read上的-n 3修饰符标志。这与已经建立的可用性模型是背道而驰的,当然,除非他们三次命中数字选择,从而触发3-char最低要求(这也是违反直觉的)。

The问题是将\033[A视为3个字符,因此需要使用-n 3。0-9被视为单个字符(这意味着如果我将其更改为-n 1,它们的行为与预期一样,但现在箭头键失败,只收集转义字符)。

So,我想我想知道的是:有没有办法侦听 -n 1 {OR} 3 (whichever comes first)**?**我似乎不能发送\n\r或类似的东西,因为在read解决之前,它们没有任何效果(这意味着我没有办法简单地离开-n 3,同时运行一个并行进程来检查输入的值是否为0-9 (如果输入的值是单个字符)。

我没有嫁给这种方式。我不介意使用awksed,甚至expect (尽管最后一次我仍然对此感到困惑)。我不在乎是否是read做收集工作。

编辑:

溶液

代码语言:javascript
复制
read -n1 c
case "$c" in
    (1) echo One. ;;
    (2) echo Two. ;;
    (状态:已解决的@乔罗巴到救援!溶液解释我会尽我最大的努力来解释:他的解决方案包括嵌套两个read语句(我一直在顺序地尝试它们)--正是这样,再加上-t.001 (从而在函数上设置了一个几乎即时的超时),从而启用了结转读取。我的问题是,我一直监视的转义键有3个字符长(因此我设置了-n3标志)。直到后来,我才意识到接受某些单一字符的输入也是有利的。他的解决方案是提出一个**(案例:基本上‘'Upon读取转义字符.’(**()Create another读取(这一次等待两个字符),并在纳秒之后设置为超时值,避免了转义字符上的反斜杠。由于read的行为显然是“溢出”下一次read声明的剩余投入,因此该声明启动了它的超时倒计时,所寻求的价值已经被播种。因为这满足了为read定义的需求标志,所以测试第二组用例结果的字符就变成了一个简单的问题(而且由于初始化函数仍然得到它期望的响应,尽管是从另一条语句中得到的,所以程序继续进行,就好像它已经得到了我最初想要解决的结果一样。\033') 
        read -t.001 -n2 r
        case "$r" in
            ('[A') echo Up. ;;
            ('[B') echo Down. ;;
        esac
esac

K127状态:已解决的K228

@乔罗巴到救援!

K129溶液解释K230

我会尽我最大的努力来解释:

他的解决方案包括嵌套两个D31语句(我一直在顺序地尝试它们)--正是这样,再加上D32 (从而在函数上设置了一个几乎即时的超时),从而启用了结转读取。

我的问题是,我一直监视的转义键有3个字符长(因此我设置了D33标志)。直到后来,我才意识到接受某些单一字符的输入也是有利的。

K134他的解决方案是提出一个D35案例:K236

基本上

G137H138

‘'Upon读取转义字符.’(D39)

H240H141

D42读取D43(这一次等待两个字符),并在纳秒之后设置为超时值,避免了转义字符上的反斜杠。

H244G245

由于D46的行为显然是“溢出”下一次D47声明的剩余投入,因此该声明启动了它的超时倒计时,所寻求的价值已经被播种。因为这满足了为D48定义的需求标志,所以测试第二组用例结果的字符就变成了一个简单的问题(而且由于初始化函数仍然得到它期望的响应,尽管是从另一条语句中得到的,所以程序继续进行,就好像它已经得到了我最初想要解决的结果一样。

\033')案例:K236

基本上

G137H138

‘'Upon读取转义字符.’(D39)

H240H141

D42读取D43(这一次等待两个字符),并在纳秒之后设置为超时值,避免了转义字符上的反斜杠。

H244G245

由于D46的行为显然是“溢出”下一次D47声明的剩余投入,因此该声明启动了它的超时倒计时,所寻求的价值已经被播种。因为这满足了为D48定义的需求标志,所以测试第二组用例结果的字符就变成了一个简单的问题(而且由于初始化函数仍然得到它期望的响应,尽管是从另一条语句中得到的,所以程序继续进行,就好像它已经得到了我最初想要解决的结果一样。

\033') read -t.001 -n2 r case "$r" in ('[A') echo Up. ;; ('[B') echo Down. ;; esac esacK127状态:已解决的K228

@乔罗巴到救援!

K129溶液解释K230

我会尽我最大的努力来解释:

他的解决方案包括嵌套两个D31语句(我一直在顺序地尝试它们)--正是这样,再加上D32 (从而在函数上设置了一个几乎即时的超时),从而启用了结转读取。

我的问题是,我一直监视的转义键有3个字符长(因此我设置了D33标志)。直到后来,我才意识到接受某些单一字符的输入也是有利的。

K134他的解决方案是提出一个D35案例:K236

基本上

G137H138

‘'Upon读取转义字符.’(D39)

H240H141

D42读取D43(这一次等待两个字符),并在纳秒之后设置为超时值,避免了转义字符上的反斜杠。

H244G245

由于D46的行为显然是“溢出”下一次D47声明的剩余投入,因此该声明启动了它的超时倒计时,所寻求的价值已经被播种。因为这满足了为D48定义的需求标志,所以测试第二组用例结果的字符就变成了一个简单的问题(而且由于初始化函数仍然得到它期望的响应,尽管是从另一条语句中得到的,所以程序继续进行,就好像它已经得到了我最初想要解决的结果一样。

\033'))H240H141

D42读取D43(这一次等待两个字符),并在纳秒之后设置为超时值,避免了转义字符上的反斜杠。

H244G245

由于D46的行为显然是“溢出”下一次D47声明的剩余投入,因此该声明启动了它的超时倒计时,所寻求的价值已经被播种。因为这满足了为D48定义的需求标志,所以测试第二组用例结果的字符就变成了一个简单的问题(而且由于初始化函数仍然得到它期望的响应,尽管是从另一条语句中得到的,所以程序继续进行,就好像它已经得到了我最初想要解决的结果一样。

\033') read -t.001 -n2 r case "$r" in ('[A') echo Up. ;; ('[B') echo Down. ;; esac esacK127状态:已解决的K228

@乔罗巴到救援!

K129溶液解释K230

我会尽我最大的努力来解释:

他的解决方案包括嵌套两个D31语句(我一直在顺序地尝试它们)--正是这样,再加上D32 (从而在函数上设置了一个几乎即时的超时),从而启用了结转读取。

我的问题是,我一直监视的转义键有3个字符长(因此我设置了D33标志)。直到后来,我才意识到接受某些单一字符的输入也是有利的。

K134他的解决方案是提出一个D35案例:K236

基本上

G137H138

‘'Upon读取转义字符.’(D39)

H240H141

D42读取D43(这一次等待两个字符),并在纳秒之后设置为超时值,避免了转义字符上的反斜杠。

H244G245

由于D46的行为显然是“溢出”下一次D47声明的剩余投入,因此该声明启动了它的超时倒计时,所寻求的价值已经被播种。因为这满足了为D48定义的需求标志,所以测试第二组用例结果的字符就变成了一个简单的问题(而且由于初始化函数仍然得到它期望的响应,尽管是从另一条语句中得到的,所以程序继续进行,就好像它已经得到了我最初想要解决的结果一样。

\033')案例:K236

基本上

G137H138

‘'Upon读取转义字符.’(D39)

H240H141

D42读取D43(这一次等待两个字符),并在纳秒之后设置为超时值,避免了转义字符上的反斜杠。

H244G245

由于D46的行为显然是“溢出”下一次D47声明的剩余投入,因此该声明启动了它的超时倒计时,所寻求的价值已经被播种。因为这满足了为D48定义的需求标志,所以测试第二组用例结果的字符就变成了一个简单的问题(而且由于初始化函数仍然得到它期望的响应,尽管是从另一条语句中得到的,所以程序继续进行,就好像它已经得到了我最初想要解决的结果一样。

\033') read -t.001 -n2 r case "$r" in ('[A') echo Up. ;; ('[B') echo Down. ;; esac esacK127状态:已解决的K228

@乔罗巴到救援!

K129溶液解释K230

我会尽我最大的努力来解释:

他的解决方案包括嵌套两个D31语句(我一直在顺序地尝试它们)--正是这样,再加上D32 (从而在函数上设置了一个几乎即时的超时),从而启用了结转读取。

我的问题是,我一直监视的转义键有3个字符长(因此我设置了D33标志)。直到后来,我才意识到接受某些单一字符的输入也是有利的。

K134他的解决方案是提出一个D35案例:K236

基本上

G137H138

‘'Upon读取转义字符.’(D39)

H240H141

D42读取D43(这一次等待两个字符),并在纳秒之后设置为超时值,避免了转义字符上的反斜杠。

H244G245

由于D46的行为显然是“溢出”下一次D47声明的剩余投入,因此该声明启动了它的超时倒计时,所寻求的价值已经被播种。因为这满足了为D48定义的需求标志,所以测试第二组用例结果的字符就变成了一个简单的问题(而且由于初始化函数仍然得到它期望的响应,尽管是从另一条语句中得到的,所以程序继续进行,就好像它已经得到了我最初想要解决的结果一样。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-11-06 11:13:15

您可以为-n 1读取,如果第一个是\033,则可以读取以下两个,并相应地作出反应。否则,直接处理数字。

代码语言:javascript
复制
#!/bin/bash

read -n1 c
case "$c" in
    (1) echo One. ;;
    (2) echo Two. ;;
    (\033') 
        read -t.001 -n2 r
        case "$r" in
            ('[A') echo Up. ;;
            ('[B') echo Down. ;;
        esac
esac
票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/480081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档