我有这个简短的剧本:
until [[ $ACTION == "t" ]]; do
read -sn1 ACTION
case $ACTION in
e|E) printf "£\n";;
done
当我按“e”时,会打印一个井号。当我按住“e”时,我会得到一连串的“£”,一个在另一个之下。
有没有办法做到这一点: 按住“e”键,只打印一个“£”,直到“e”被释放并再次按下?
这就是问题所在:没有TIMEOUT“-t”开关阅读
请帮助:)
=============一天后编辑==============
我想解决的问题是: 我可以使用tput命令组合在屏幕上移动符号。当在读取命令中设置TIMEOUT时,可能会发生两件事:TIMEOUT足够大,按住键不会连续移动符号 - 但是快速点击键会破坏符号屏幕;或者如果TIMEOUT很小,快速点击不会破坏屏幕,但按住键会产生ALARM CLOCK中断。 所以,我不希望Bash等待输入。我希望它能够读取一次按下的箭头键,就是这样 - 用户需要释放键并再按一次继续移动。
我一直在使用此功能,但它产生了所有这些问题:
ReadKey() {
# Wait for first char
if read -sN1 ACTION; then
# Read rest of chars
while read -sN1 -t 0.05 ; do
ACTION+="${REPLY}"
done
fi
}
然后
Readkey;做 case $ACTION in
[case options follow]
答案 0 :(得分:1)
我得出结论,这是一个Windows问题。 我在Ubuntu上运行游戏,它就像一个梦想。
答案 1 :(得分:0)
您可以在支持的终端上使用DECARM扩展名来禁用自动重复:
printf '\e[?8l'
要重新启用自动重复,请使用printf '\e[?8h'
答案 2 :(得分:0)
也许你可以使用stty实现你的目标,这样的事情应该适用于你的场景:
stty -echo -icanon time 1 min 0 ;
ACTION=''
until [[ $ACTION == "t" ]]; do
read ACTION
case $ACTION in
e|E) printf "£\n";;
esac
done
stty sane;
我不确定这会在"快速点击"使用,但如果是这样,提供有关此类损坏的详细信息,我会尽力帮助您。