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 的新手,上面不是我自己做的。我在互联网上找到了这个脚本。while 和 do 是我自己做的一个循环。每次用户填写错误的数字它必须返回,直到用户填写正确的格式。

真正的问题在于代码的后半部分。当我填写错误的 IP(如 10.10.10.a)时,我得到了我想要的错误,我必须第二次填写我的 IP。当我输入 10.41.12.r 时,出现了一个错误,但这一次,没有抱怨最后的 r,但仍然抱怨我首先插入的 a。10.41.12 将被检查,但最后一个字符不同。

我可以想象一切都将存储在内存中,但我该如何清除呢?unset 或 $oct=
不起作用

希望有人可以帮助我。这是我第一次编程,这让我很头疼

谢谢。

戴夫

4

2 回答 2

1

for不会多次评估条件。它只运行了 4 次,设置$oct$1... $4如果您尝试多次,您的输入将被接受,即使不是数字。此外,在循环输入后,您应该再次检查“必须有 4 个部分”。

顺便说一句,您应该检查每个$oct <= 255.

于 2012-10-25T13:58:01.437 回答
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
于 2013-11-20T09:20:50.340 回答