たとえば、ユーザーが を入力しfoofoo\b\b\bbar
て Enter キーを押すと、代わりにvar
同じことがわかります。はい、ユーザーは削除機能を失うため、削除するには別のショートカットを使用する必要があります。それとも少なくともその逆です。一般的なバックスペース(押下)は修飾子を提供し、バックスペースは文字通りのバックスペースを提供します。foofoo\b\b\bbar
foobar
foobar
read
テキストバックスペースを許可する方法はありますか?
答え1
以下を使用して文字をそのまま入力できますCtrlv。
bash-4.2$ read foo
abc^Hfoo
bash-4.2$ printf "%s\n" "$foo" | od -c
0000000 a b c \b f o o \n
0000010
bash-4.2$ printf "%q\n" "$foo"
$'abc\bfoo'
はい(または端末設定によって同じでなければなりません)^H
。Ctrlv BackspaceCtrlv CtrlH
答え2
\b
ユーザー入力(バックスラッシュ-b)をバックスペースとして許可するには、次のように置き換えることができますread
。
read -r var
var=${var//\\b/$'\b'}
ユーザーがバックスペースキーを使用せずに押すことができるようにするには、Ctrl-V
端末の消去文字を一時的にオフにします。後で^?
/を/\x7f
に変更する必要があるかもしれません^H
。\x08
stty_saved=$(stty -g)
stty erase ""
read var
var=${var//$'\x7f'/$'\b'}
stty "$stty_saved"
バックスペースはまだ^?
同じ印刷されますCtrl-V
。
(バックスペースキーを使用して画面上の文字を削除したいが、まだバックスペースキーと削除された文字を保存したい場合は、手動で実装する必要があります。)
答え3
このスクリプトは以下を除いて許可されます。
- ^C(ASCII 03 ETX)
- ^J(ASCII 0A LF)
- ^M(ASCII 0D CR)
- ^Z(ASCII 1Aサブ)
- ^\(ASCII 1C FS)
他のすべての制御文字を含みます。
#!/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"
CTRLタイプ - バックスペース用ですH。
変える:
printf '\n%s\n' "$var"
そして:
printf '%s' "$var" | od -An -tx1
実際にバイト値を「参照」します。