bash - 读取 N 个字符或按回车键退出
问题描述
我有以下功能,当我按一次 Enter 运行第一个案例然后退出时,我想要。现在我必须按 Enter 4 次才能退出。另外,当我只按一个或两个数字然后输入以立即显示消息“超出范围的数字”时,而不是在每个案例两次或三次之后。
function MakeSomething () {
while true; do
echo -en "Input : "
read -N4 vn
echo
case $vn in
"") if [ -z "$vn" ] ; then vn=3000 ; echo ${vn} ; exit ; fi ; break ;;
*) [[ $vn =~ ^[0-9]+$ ]] || { echo -e '\nSorry input a number between 0011 and 2559\n' ; continue; }
if ((vn >= 0011 && vn <= 2559)); then echo ${vn} ; else echo -e '\nNumber out of Range, input a number between 0011 and 2559\n' ; fi ; MakeSomething ;break
esac
done
}
解决方案
首先,我来回答你的问题:
按 enter 4 次退出。
这是因为您使用的是read -N4
,这意味着您从输入中读取了四个字符。所以你需要四个 Enter。我的建议是更改为-a
,从输入中读取,直到Enter
解决此问题。
我只按一个或两个数字,然后输入以立即显示消息“数字超出范围”,而不是在每个案例两次或三次之后。
我认为您不应该在case
子句中调用该函数,因为您已经使用了 while 循环。应该让它继续下去。
这是我的代码://它有效
#!/bin/sh
function MakeSomething () {
while true; do
echo -en "Input : "
read -a vn
echo
case $vn in
"") if [ -z "$vn" ] ; then vn=3000 ; echo ${vn} ; exit ; fi ; break ;;
*) [[ $vn =~ ^[0-9]+$ ]] || { echo -e '\nSorry input a number between 0011 and 2559\n' ; continue; }
# check input len
if [ ${#vn} -ge 5 ] || [ ${#vn} -le 3 ]; then echo '\n need exactly four number'; continue; fi
if ((vn >= 0011 && vn <= 2559)); then echo ${vn} ; else echo -e '\nNumber out of Range, input a number between 0011 and 2559\n' ; fi
esac
done
}
MakeSomething
推荐阅读
- javascript - 从查询输出 JSON 数组 | 节点JS
- html - 服务器端渲染,延迟加载响应图像,正确的做法
- google-colaboratory - 如何限制 Google Colaboratory 中的单元格文本输出?
- python - 神经网络的输入大小不匹配
- node.js - 将数据推送到弹性搜索索引时拒绝 Firebase 中的映射更新错误
- x86 - 为什么“i586”指的是 Pentium 1,为什么“i686”指的是 Pentium Pro?
- javascript - 如何强制禁用 Babeljs 生成的“使用严格”模式
- sql - 为什么从 Query 和 SSMS 备份时数据库备份大小不同?
- angular - 材质对话框:使用多个对话框实例管理点击事件的 Z-index
- angular - 如何使用一些参数从另一个 Web 应用程序启动 Angular 应用程序?