首页 > 解决方案 > 读取 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
}

标签: bashshellexit

解决方案


首先,我来回答你的问题:

按 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


推荐阅读