这有点矫枉过正!
因此,我首先要嘱咐您看一下dialog
,whiptail
和其他curses
shell 包装器。
但这一切都可以完成这项工作。(我希望你永远不会把它们放在生产阶段;-)
$ char=""; while [ ! "$char" ] ;do
char="$(
(
stty -echo raw
dd bs=1 if=/dev/tty of=/dev/fd/4 >/dev/null 2>&1 &
sleep .1
kill $! 2>/dev/null
stty sane
) 4>&1 >/dev/null
)"
done
$ echo -n "$char" | od -A n -t c
033 [ 2 4 ~
更新(再次)
...假设您不会在 0.1 秒内按下两个不同的键。(这甚至不可能是真的,但如果在对话框菜单上,这可能是......)
从那里:
readKey() {
local char
while [ ! "$char" ] ;do
char="$(
(
stty -echo raw
dd bs=1 if=/dev/tty of=/dev/fd/4 >/dev/null 2>&1 &
sleep .1
kill $! 2>/dev/null
stty sane
) 4>&1 >/dev/null
)"
done
printf -v ${1:-REPLY} "$char"
}
str=""
while [ "$str" != "exit" ] ;do
readKey KEY
str+="$KEY"
[ ${#str} -gt 4 ] && str="${str:${#str}-4}"
case "$KEY" in
$'\x1b[A') echo "press arrow up";; # OK
$'\x1b[B') echo "press arrow down";; # OK
$'\x1b[15~') echo "press key F5";; # Ok, for me.
* ) echo "pressed: '$(echo -n "$KEY"| od -A n -t c)'" ;;
esac
done
比敲一些键...
press key F5
press arrow up
press arrow down
pressed: ' 033 [ F'
pressed: ' 033 [ 6 ~'
pressed: ' 033 [ 3 ~'
pressed: ' q'
pressed: ' e'
pressed: ' x'
pressed: ' i'
pressed: ' t'
点击e x i t
结束循环。