相信很多朋友写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
运行通过
从上面的结果可以看出