-2

如何设置不同字符的读取?有谁知道解决方案?

while true
do
    read -sn3 KEY

        case "$KEY" in
             $'\x1b[A') echo "press arrow up";;   # OK
             $'\x1b[B') echo "press arrow down";; # OK
             $'\x1b[15~') echo "press key F5";;   # Problem !!!
        esac
done

谢谢

4

1 回答 1

4

这有点矫枉过正!

因此,我首先要嘱咐您看一下dialog,whiptail和其他cursesshell 包装器。

但这一切都可以完成这项工作。(我希望你永远不会把它们放在生产阶段;-)

$ 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结束循环。

于 2012-11-05T00:25:04.583 回答