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
運行通過

從上面的結果可以看出

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