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を入力すると、希望どおりのエラーが発生し、2回目のIPを入力する必要があります。10.41.12.rと入力するとエラーが発生しましたが、今回は最後のrについては文句を言わず、最初に挿入したaについては文句を言います。10.41.12はチェックされますが、その最後の文字は異なります。

すべてがメモリに保存されることは想像できますが、どうすればそれをクリアできますか?unsetまたは$oct=
は機能しません

誰かがこれで私を助けてくれることを願っています。プログラミングは初めてですが、これは私に頭痛の種を与えています

ありがとう。

デイブ

4

2 に答える 2

1

for条件を複数回評価しません。..に設定$octして、4回実行するだけです。数回試行すると、数値でなくても入力が受け入れられます。また、ループで入力を取得した後、「Must have 4parts」に再度チェックを入れる必要があります。$1$4

ところで、それぞれを確認する必要があります$oct <= 255

于 2012-10-25T13:58:01.437 に答える
0

重複したコードはしばしば悪いものです。入力を 1 か所で読み取り、毎回同じテストを実行することをお勧めします。

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 に答える