例如,用户键入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
该脚本(在 bash 中)将接受除
- ^C (ASCII 03 ETX)
- ^J (ASCII 0A LF )
- ^M(ASCII 0D CR)
- ^Z(ASCII 1A SUB)
- ^\ (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
实际“查看”字节值。