read命令添加无限循环的功能的技巧

相信很多朋友写shell脚本的时候都用过read命令,但是在传参数的过程中总会避免不了输入的参数的值不正确,这时候我们只能选择结束结束脚本重新运行脚本重新输入,这样就相对麻烦很多,特别是需要输入的参数又多又长的时候,所以我们需要一个功能呢,在输入到每一个参数的时候,脚本都会做出判断,输入不正确,则重新输入。
例如我现在有这样的需求,在输入参数的时候,不能是空值,不能含有空格,不能含有英文,不能含有控制字符,脚本如下:

#!/bin/bash
read -p "输入:" str
echo "${str}" | grep -qE [[:space:]]
st1=$?
echo "${str}" | grep -qE [[:alpha:]]
st2=$?
echo "${str}" | grep -qE [[:cntrl:]]
st3=$?

if [ "${st1}" -eq 0 -o "${st2}" -eq 0 -o "${st3}" -eq 0 ];then
   echo "输入不正确,重新输入"
   exit 1
fi

echo "运行通过"

运行输入错误的结果如下:

[root@redhat_192.168.0.12 13:56:01 ~]#sh 5.sh 
输入:sf        //输入英文,直接退出脚本,重新输入
输入不正确,重新输入

现在的目的是能够对输入的值做出判断并且重新输入,可以通过while循环去实现,改后的脚本如下:

#!/bin/bash
##将判断定义成为功能函数,下面直接调用函数就可以
grep_judge_str () 
{
        echo "${str}" | grep -qE [[:space:]]
        st1=$?
        echo "${str}" | grep -qE [[:alpha:]]
        st2=$?
        echo "${str}" | grep -qE [[:cntrl:]]
        st3=$?
}

##脚本从这里开始
read -p "输入:" str

##第一次判断
grep_judge_str  

##将第一次判断所得的值传给while做循环
while [ "${st1}" -eq 0 -o "${st2}" -eq 0 -o "${st3}" -eq 0 ]
do
      read -p "输入错误,重新输入:" str
      ##第二次以及后面所有次数的判断 ,只要条件不满足if判断,就永远不会退出while循环
      grep_judge_str

      if [ "${st1}" -ne 0 -a "${st2}" -ne 0 -a "${st3}" -ne 0 ]
      then
           break 
      fi
done

echo "运行通过"

运行脚本的结果如下:

[root@redhat_192.168.0.12 14:11:23 ~]#sh 5.sh                                                        
输入:afa
输入错误,重新输入:asf45
输入错误,重新输入:1 2
输入错误,重新输入:^H^H
输入错误,重新输入:^H
输入错误,重新输入:123456
运行通过

从上面的结果可以看出

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章