如何删除 bash read -d 多行输入中的一个字符?

How to delete a character in bash read -d multiline input?

我正在编写一个 bash 脚本,它将使用 readline 命令来捕获用户的多行输入(包列表),但我不知道如何在输入文本时删除(反斜杠)字符(假设我犯了一个错误)。以下是我暗示的代码部分。

read -d `echo -e "\e"` -p $'Give me a list:\n' PACKAGES

\e 是退出多行输入的转义字符。这是我尝试删除字符时得到的结果(我确实尝试了我知道的所有方法:alt+backslash,ctrl+w;ctrl+u):

# read -d `echo -e "\e"` -p $'Give me a list:\n' vPACKAGES
Give me a list:
line one
line two
line 3^H^W^U^H^

如您所见,^H 是反斜杠的解释方式,^W =ctrl+w,所以我无法删除任何字符,只能使用 escape 进行转义。我确实尝试过使用读取标志,-e 让我删除字符,但 enter 不再是换行符。

提前感谢您的建议和帮助。

我根本不会这样做。我只会在循环中提示输入值,直到你得到一个空条目或其他一些分隔符。

像这样(未经测试):

pkgs=()
printf 'Give me a list:\n'
while read -e pkg; [ -n "$pkg" ]; do
    # Validate package, etc., etc.
    pkgs+=("$pkg")
done
# Use `${pkgs[@]}` ...

如果您有其他终止条目,您可以使用任何其他测试而不是 [ -n "$pkg" ]。 (例如 [ "$pkg" = "." ] 测试 .,等等)

或者,正如 glenn jackman 正确补充的那样,使用 bash 的较新 (4.0+) 版本,可以在此处使用新的 readarray 内置函数,如下所示:

printf 'Enter package names, one per line: hit Ctrl-D on a blank line to stop\n'
readarray -t pkgs