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または他の文字でキャプチャされた文字はバイト値に変換されません。
以下を除くすべての制御文字:
- ^C(ASCII 03 ETX)
- ^J(ASCII 0A LF)
- ^M(ASCII 0D CR)
- ^Z(ASCII 1Aサブ)
- ^\(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"