0

シェルスクリプトを使ったことがないので、これはまったく新しいことです。私はうまくいくものを作ることができましたが、ひどく最適化されており、それをどのように改善するのか分かりません。どちらかといえば、それはかなり陽気なスクリプトです:

#/bin/bash

get_char() {
    old_tty_settings=`stty -g`
    stty -icanon min 0 time 1
    stty cbreak
    grabbed_char=`dd if=/dev/tty bs=1 count=1 2>/dev/null`
    stty -cbreak
    stty "$old_tty_settings"
}

while true; do

    unset char00
    unset char01
    unset char02
    unset char03
    unset char04
    unset char05

    echo -e "\nWaiting for keystroke..."
    read -n 1 char00

    while true; do

        get_char; char01=$grabbed_char

        if [ "$char01" != "" ]; then get_char; char02=$grabbed_char
            else break
        fi
        if [ "$char02" != "" ]; then get_char; char03=$grabbed_char
            else break
        fi
        if [ "$char03" != "" ]; then get_char; char04=$grabbed_char
            else break
        fi
        if [ "$char04" != "" ]; then get_char; char05=$grabbed_char
            else break
        fi

    done

    fullstring=$char00$char01$char02$char03$char04$char05
    echo -e "\nFULLSTRING:  !$fullstring!"

done

リストはずっと長いですが、私はあなたを惜しまなかった。

基本的に、プログラムはキーストロークを待つために永久にターミナルに座る必要があります。最初のキーストロークの後、次のキーストロークを非常に短い時間(この場合は1/10秒)待つ必要があります。その短時間にキーストロークが登録されていない場合は、出力(sedコマンドでパイプ処理されます)をエコーし​​、再起動します。

これは、4文字または100文字をスキャンできるバーコードスキャナーで使用することを目的としています。データをできるだけ早く処理したいのです。つまり、何かがスキャンされてから1秒遅れる必要はありません。

キャラクターを受け取ったときに「charXX」を作成できれば、良い解決策になります。助けてくれてありがとう。

4

1 に答える 1

2

これであなたのインナーを交換することはあなたが望むことをしますか?

read -n 1 fullstring

while true; do
    get_char
    if [ -n "$grabbed_char" ] ; then
        fullstring="$fullstring$grabbed_char"
    else
        break
    fi
done
echo -e "\nFULLSTRING:  !$fullstring!"

ちなみに、[...]が組み込まれていない古いシェルでは、ifをこれに置き換えると実行速度が速くなります。

case "$grabbed_char" in
    "")  break ;;
    *) fullstring="$fullstring$grabbed_char" ;;
esac
于 2013-01-24T18:01:13.850 に答える