2012-10-25 121 views
2

目前我在BASH中創建一個小腳本,它會要求用戶填寫一個新的IP地址,子網和網關。該輸入到一個文件,將被寫入/ etc/network/interface ..清空變量

我得到了腳本的工作,但它不是防彈。

當用戶輸入時,不是一個數字而是一個字母字符,它返回並且用戶需要再次填充一個數字。 當用戶仍然使用字母字符時,即使出現錯誤,腳本也會繼續。

我的代碼:

echo "Fill in your IP" 
    read NEW_IP 

    oldIFS=$IFS 
    IFS=. 
    set -- $NEW_IP 

    while [ $# -ne "4" ]; do 
     echo "Must have 4 parts" 
     read NEW_IP 
     set -- $NEW_IP 
    done 

    for oct in $1 $2 $3 $4; do 
     echo $oct | egrep "^[0-9]+$" >/dev/null 2>&1 
     while [ "$?" -ne "0" ]; do 
      echo "$oct is not numeric. fill your IP in the correct format;" 
     read NEW_IP 
     set -- $NEW_IP 
    done 

我是新使用bash,上面我沒有通過我自己做到這一點。我在網上找到了這個腳本。在一段時間,我做了一個循環。 每次用戶填寫錯誤的號碼它必須返回,直到用戶填寫正確的格式。

真正的問題在於代碼的後半部分。當我填寫一個像10.10.10.a這樣的錯誤IP時,我得到了我想要的錯誤,並且必須第二次填寫我的IP。 當我輸入10.41.12.r時,發生了一個錯誤,但是這次沒有抱怨最後的r,但仍然抱怨我在第一個插入的a。 10.41.12將被檢查,但最後一個字符不同。

我可以想象,一切都將存儲在內存中,但我該如何清除? 未設置或$ oct =
將不起作用

希望有人可以幫助我這個。這是我第一次編程,這讓我很頭疼

謝謝。

戴夫

+0

即代碼段是不是整個劇本就這麼難不工作的位置評 - 但事情你是在IP再次閱讀和設置它 – Vahid

+0

做數字測試你的第一個,而裏面的長相循環。 – cdarke

回答

1

for幾次不評估條件。它只運行4次,將$oct設置爲$1 .. $4。如果您嘗試多次,即使不是數字,您的輸入也會被接受。此外,在循環中獲得輸入後,應再次檢查「必須有4個零件」。

順便說一句,你應該檢查每個$oct <= 255

+0

我該如何評估病情?我現在可以填寫2次錯誤的輸入,並且第二次我將通過 –

+0

使用'while'而不是'for'。 – choroba

0

重複的代碼通常是不好的。在一個地方更好地閱讀輸入內容,並且每次都進行相同的測試。

prompt="Fill in your IP" 
while 
    echo $prompt 
    read NEW_IP 
    IFS=. 
    set -- $NEW_IP 
    IFS= 
    if [ $# -ne 4 ] 
    then 
     prompt="Must have 4 parts" 
     continue 
    fi 
    for oct 
    do if [[ ! "$oct" =~ ^[0-9]+$ ]] 
     then 
      prompt="$oct is not numeric. fill your IP in the correct format;" 
      continue 2 
     fi 
     # You might add more checks here. 
    done 
do break 
done