É assim que eu faço isso:
#!/bin/bash
a=0
function READ {
read -t 1 -n 1 bb && ACTION
echo -ne "Hello $a times. Hit \"q\" to quit."'\r'
a='echo "$a + 1" | bc'
READ
}
function ACTION {
if [[ "$bb" == "Q" || "$bb" == "q" ]]; then
echo "Good bye!"
exit 0
else
echo -e "\n\nYou pressed $bb.\n\n"
READ
fi
}
READ
E isso é o que respondeu em Stackoverflow por Andy e funciona muito bem aqui.
O script é dele (acabei de adicionar a parte do trap como ele diz que o terminal estaria em um estado estranho se o script fosse morto):
#!/bin/bash
trap 'echo -e "\n\n############\n# #\n# Bye bye #\n# #\n############\n" && exit 1' INT
trap 'notify-send "Bye bye" "The terminal has been closed" && exit 1' HUP
if [ ! -t 0 ]; then
echo "This script must be run from a terminal"
exit 1
fi
stty -echo -icanon time 0 min 0
count=0
keypress=''
while true; do
let count+=1
echo -ne $count'\r'
# This stuff goes in _handle_keys
read keypress
case $keypress in
# This case is for no keypress
"")
;;
$'\e[C')
echo "derecha"
;;
$'\e[D')
echo "izquierda"
;;
# If you want to do something for unknown keys, otherwise leave this out
*)
echo "unknown input $keypress"
;;
esac
# End _handle_keys
done
stty sane