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