相信很多朋友寫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
運行通過
從上面的結果可以看出