(如何)我可以通过 `read var` 将文字 \b (退格键)添加到 var 中?

(如何)我可以通过 `read var` 将文字 \b (退格键)添加到 var 中?

例如,用户键入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'

是(或 ,应该相同,具体取决于终端设置)^HCtrlv 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 中)将接受除

  1. ^C (ASCII 03 ETX)
  2. ^J (ASCII 0A LF )
  3. ^M(ASCII 0D CR)
  4. ^Z(ASCII 1A SUB)
  5. ^\ (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

实际“查看”字节值。

相关内容