shell脚本响应按键

我有一个shell脚本,基本上是这样说的

while true; do
    read -r input
    if ["$input" = "a"]; then 
        echo "hello world"           
    fi
done

这一切都很好,但很好,但我意识到在这种情况下必须按ENTER才会出现严重问题。 我需要的是脚本在按下某个键时作出响应,而不必按Enter键。

有没有办法在shell脚本中实现这个功能?


read -rsn1

期待只有一封信(并且不要等待提交)并保持沉默(不要将该信写回)。


所以最后的工作片段如下:

#!/bin/bash

while true; do
read -rsn1 input
if [ "$input" = "a" ]; then
    echo "hello world"
fi
done

另一种方式,以非阻塞的方式(不知道它是否是你想要的)。 您可以使用stty将最小读取时间设置为0.(如果之后不使用stty sane会有点危险)

stty -icanon time 0 min 0

然后就像正常一样运行你的循环。 不需要-r。

while true; do
    read input

    if ["$input" = "a"]; then 
        echo "hello world"           
    fi
done

重要! 在完成非阻塞之后,您必须记住将stty设置回正常使用状态

stty sane

如果你不能在终端上看到任何东西,它会显示挂起。

您可能想要为ctrl-C创建一个陷阱,就好像该脚本已退出,然后将stty恢复为正常状态,您将无法看到任何键入的内容,并显示终端已冻结。

trap control_c SIGINT

control_c()
{
    stty sane
}

PS你也可能想在你的脚本中放一个睡眠声明,这样你就不会耗尽你所有的CPU,因为它会持续以尽可能快的速度运行。

sleep 0.1

PSS看来,悬挂的问题只有当我用过-echo,因为我可能不需要。 我会在答案中留下它,因为将stty重置为默认值以避免将来出现问题仍然很好。 如果你不希望你输入的内容出现在屏幕上,你可以使用-echo。

链接地址: http://www.djcxy.com/p/25543.html

上一篇: shell script respond to keypress

下一篇: Restore git submodules from .gitmodules