BASH:只读取一次输入,在释放按键之前不要继续读取

时间:2014-05-04 22:18:43

标签: bash

我有这个简短的剧本:

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]

3 个答案:

答案 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; 

我不确定这会在"快速点击"使用,但如果是这样,提供有关此类损坏的详细信息,我会尽力帮助您。