-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およびその他cursesのシェルのラッパーをご覧になることをお勧めします。

しかし、これでうまくいく可能性があります。(私はあなたがそれらを生産段階に置かないことを願っています;-)

$ 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 秒以内に 2 つの異なるキーを押さないと仮定します。(これは真実ではないかもしれませんが、ダイアログメニューの場合、これは可能性があります...)

そこから:

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 に答える