Linux Bash'阅读'和-n nchars处理换行符

时间:2015-10-10 13:19:02

标签: linux bash

以下代码:

read -n 3 -r -p "Enter up to 3 characters  -> : "
echo "string"

输入两个字符并按Return键时输出:

Enter up to 3 characters  -> : 12
string

但是,当输入3个字符而没有返回时,它会产生:

Enter up to 3 characters  -> : 123string

我想看看:

Enter up to 3 characters  -> : 123
string

不幸的是,换行符\ n不是$ REPLY变量的一部分,否则我可以检查它并在缺少新行时输出回声。

我需要这个的原因是如果输入无效则输出错误消息,因此使用-N或-n 4不是解决方案。

有什么想法吗?谢谢!

顺便说一下,我已经在考虑以下内容了,它产生了我想要的输出,但不幸的是,我已经使用了" tput sc"对于别的东西,因此不能再使用它。

echo; tput sc; tput cuu1
read -n 3 -r -p "Enter up to 3 characters  -> : "
tput rc; echo "string"

2 个答案:

答案 0 :(得分:1)

您可以检查REPLY的长度是否符合您的预期。 如果匹配,则不按Enter键,因此回显一个空行。

len=3
read -n $len -r -p "Enter up to 3 characters  -> : "
(( ${#REPLY} == $len )) && echo
echo "string"

如果长度小于len,则必须按Enter键。

或者,如果用户规避了输入控件,那么它可能并不重要,是吗?

答案 1 :(得分:0)

我已经完成了一些测试,虽然检查$ REPLY的长度似乎是最初的方法,但我最终得到了一个不同的解决方案。

我注意到使用read -n nchar时的退格键不是删除字符,而是打印^?而是符号。我通过使用-e参数添加readline支持来纠正了这个问题。

  

-e:在交互式shell上:使用Bash的readline界面来读取数据

例如:

read -e -n 3 -r -p "Enter up to 3 characters  -> : "
or 
read -ern 3 -p Enter up to 3 characters  -> : "

这不仅修复了退格键或删除键,还添加了缺少的换行符,如初始帖子中所述。这使得不再需要检查$ REPLY的长度,这实际上会在不需要的情况下添加额外的换行符。

无论如何,非常感谢您的回复。它确实帮助我继续我正在做的事情,最后并不是最后找到解决方案,尽管它与建议的不同。最好的问候!