如何删除 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
我正在编写一个 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