【问题标题】:read -e removes the whole lineread -e 删除整行
【发布时间】:2021-10-23 22:07:22
【问题描述】:

我在我的脚本中使用 Bash 和 read 命令来输入姓氏和名字。姓氏和名字描述在输出中的同一行。现在在read 中有一个-e 参数可以使用backspace 键执行删除,但是,执行删除时将删除沿此行的所有字符。有什么办法可以预防吗?

#!/bin/bash
clear
tput cup 0 25
echo -n "First Name: JOHN"
tput cup 0 0
echo -n "Last Name: " $lastname
read -e -n10 lastname

【问题讨论】:

  • 不清楚你在问什么。如果您想从一行中读取两个值,请使用两个变量:read -r firstname lastname(其中-r 基本上总是一个好主意,除非您特别需要反斜杠周围的奇怪逻辑行为)。
  • 我避免使用 -r 参数,因为它不能限制您输入的字符。就我而言,我使用 -n10 来限制为 10 个字符。现在,给定控制台中显示的名字:JOHN 作为输出以及同一行上的姓氏:$lastname,执行 $lastname 退格删除时将删除名字:JOHN。
  • 您在这里使用Readline 的哪些功能?
  • @Armali 我没有使用 Readline 命令行编辑设置任何内容,我相信它使用默认的 Emacs 编辑器,但阅读后我尝试在脚本中添加 set -o vi 但仍然同样的结果。
  • 是否可以在声明的字符数内开始编辑行?假设 -n10 和退格将从第 10 个字符开始向左移动直到第 1 个字符,而不是整个单行?

标签: bash shell readline


【解决方案1】:

是否可以在声明的字符数内开始编辑行?

read -e 如果添加选项-i 会执行此操作,前提是当前变量值的长度在声明的字符数内; e. g.:

read -ei"$lastname" -n10 lastname

假设 -n10 并且退格将从第 10 个字符开始向左移动直到第 1 个字符,而不是整个单行?

在我目前看到的所有情况下,光标都没有移回输入开始时的位置。 但由于行为可能取决于 e。 G。 shell 版本和终端功能,您可能更喜欢类似

newname=`dialog --max-input 10 \
                --inputbox "First Name: JOHN\nLast Name: " 0 0 "$lastname" \
         2>&1 >/dev/tty` && lastname="$newname"; clear

【讨论】:

  • 感谢@Armali 的回复,但经过尝试,结果与read -n10 lastname 相同。
  • 作为附加信息,我在 CentOS 8 中使用 bash-4.4.19-12.el8.aarch64。
  • 结果是否一样是否意味着即使使用-ei"$lastname",光标也不会定位在当前$lastname的最后一个字符之后?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
相关资源
最近更新 更多