以下代码:
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"
答案 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的长度,这实际上会在不需要的情况下添加额外的换行符。
无论如何,非常感谢您的回复。它确实帮助我继续我正在做的事情,最后并不是最后找到解决方案,尽管它与建议的不同。最好的问候!