編集3

編集3

PressはEnterまだ区切り文字を実行しますが、readコンソールのスクロールを中断することなくコマンドが静かに終了します。デフォルトでは、Aはread -sエンドラインにのみ影響します。

ベストアンサー1

n1読み取り文字が入力されると、読み取りが読み取り変数(オプションを含む)をnullに設定することを知って、次のことができます。

#!/bin/bash

while IFS= read -srn1 a ;do
    [[ "${a+x$a}" = "x" ]] && break
    var=$var$(printf '%s' "$a")
    printf '%s' "$a"
done
printf '\n%s\n' "$var"

sttyまたは他の文字でキャプチャされた文字はバイト値に変換されません。

以下を除くすべての制御文字:

  1. ^C(ASCII 03 ETX)
  2. ^J(ASCII 0A LF)
  3. ^M(ASCII 0D CR)
  4. ^Z(ASCII 1Aサブ)
  5. ^\(ASCII 1C FS)

前の文字のバックスペース文字を実際に「確認」するには、次のループを追加してvarを印刷します(上記のコードの直後)。

echo
while IFS= read -srn1 a; do
    printf '%s' "$a"
    sleep 0.5
done <<<"$var"

編集3

バックスペースキーを使用して文字をキャプチャし、変更された文字列を印刷せずに文字を削除するには、次のようにします。

#!/bin/bash

while IFS= read -srn1 a ;do
    [[ "${a+x$a}" = "x" ]] && break

    if [[ $a = $'\x7f' || $a = $'\x08' ]]; then
        var=${var%?}
        [[ $a = $'\x7f' ]] && printf '\x0d%s \x08' "$var"
        [[ $a = $'\x08' ]] && printf '\x0d%s ' "$var"
    else
        var=$var$(printf '%s' "$a")
    fi

    printf '%s' "$a"
done
printf '\n%s\n' "$var"
printf '%s' "$var" | od -An -tx1

while IFS= read -srn1 a; do
    printf '%s' "$a"
    sleep 0.5
done <<<"$var"

おすすめ記事