下面是我的策略:在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 (如果输入的值是单个字符)。
我没有嫁给这种方式。我不介意使用awk或sed,甚至expect (尽管最后一次我仍然对此感到困惑)。我不在乎是否是read做收集工作。
编辑:
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
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定义的需求标志,所以测试第二组用例结果的字符就变成了一个简单的问题(而且由于初始化函数仍然得到它期望的响应,尽管是从另一条语句中得到的,所以程序继续进行,就好像它已经得到了我最初想要解决的结果一样。
\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定义的需求标志,所以测试第二组用例结果的字符就变成了一个简单的问题(而且由于初始化函数仍然得到它期望的响应,尽管是从另一条语句中得到的,所以程序继续进行,就好像它已经得到了我最初想要解决的结果一样。
发布于 2018-11-06 11:13:15
您可以为-n 1读取,如果第一个是\033,则可以读取以下两个,并相应地作出反应。否则,直接处理数字。
#!/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
esachttps://unix.stackexchange.com/questions/480081
复制相似问题