ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

bashでもinkey$のようなキー入力を得たい

(2023-04-03 初稿 - 2023-04-08 修正)

以前、pythonでも同様にキー入力を受けるためのスクリプトを紹介した。

タイトルにある「inkey$」って、Basicにある関数(もう、知らない人の方が多いか…^^;)で、Enterしなくてもキー入力が返ってくる。

ゲーム等のすばやいキー入力を必要とする場合には、必須の機能。

このページでは、併せて矢印キー等の特殊キーの入力も得たかったので、ネットで検索して以下のページを参考にスクリプトを組んだ。多謝。

それでは、早速作成したスクリプトを紹介。

#!/usr/bin/bash
# inkey() のようなものをbashのreadで作る
# ver0.01 2023-03-23 start

read_char() {
    local CHAR rest
    IFS=   read -r -s -n1 CHAR

    if  $CHAR == $'\x1b' ; then # 先頭がバックスラッシュ
        read -r -n2 -s rest
        CHAR+="$rest"
    fi

    #echo $CHAR
    case $CHAR in
        "")
            echo "Enter"
            ;;
        $'\x7f')
            echo "Backspace"
            ;;
        $'\x20')
            echo "Space"
            ;;
        $'\x1b\x5b\x41') #up arrow
            echo "Up"
            ;;
        $'\x1b\x5b\x42') #down arrow
            echo "Down"
            ;;
        $'\x1b\x5b\x43') #right arrow
            echo "Right"
            ;;
        $'\x1b\x5b\x44') #left arrow
            echo "Left"
            ;;
        *)
            echo $CHAR
    esac
}

if [[ ${#BASH_SOURCE[@]} == 1 ]]; then
    RTN=$(read_char)
    echo $RTN
fi

最後の方のifにある${#BASH_SOURCE[@]} == 1は、上記のスクリプトを単体で実行する場合と、他のスクリプトからimportして実行する場合に便利なように記述している。

詳しくは、以下のページを参照のこと。

実際に呼び出し側のスクリプトでは、以下のようになる。

source ~/bin/inkey

for i in {1..10}; do
    echo -n "Input any key:"
    char=$(read_char)
    case "$char" in
        "q") break ;;
    esac
done

以上、皆さんの参考になれば。

関連ページ