GNU/Linux >> Linux の 問題 >  >> Linux

IP の有効性を確認する

ipcalc を使用します (RPM initscripts-9.49.49-1 のバージョン パッケージでテスト済み)

$ ipcalc -cs 10.10.10.257 && echo vaild_ip || echo invalid_ip
invalid_ip

この単一の正規表現は、0.0.0.0 から 255.255.255.255 までのアドレスのみを検証する必要があります:

#!/bin/bash

ip="1.2.3.4"

if [[ "$ip" =~ ^(([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\.){3}([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))$ ]]; then
  echo "success"
else
  echo "fail"
fi

bash を使用している場合は、クワッドを検証せずに、パターンの単純な正規表現一致を実行できます:

#!/usr/bin/env bash

ip=1.2.3.4

if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  echo "success"
else
  echo "fail"
fi

POSIX シェルで行き詰まっている場合は、 expr を使用できます ERE の代わりに BRE を使用して、基本的に同じことを行うには:

#!/bin/sh

ip=1.2.3.4

if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
  echo "success"
else
  echo "fail"
fi

expr に注意してください 正規表現が文字列の左側に固定されていると想定しているため、最初の ^ 不要です。

各クワッドが 256 未満であることを確認することが重要な場合は、明らかにより多くのコードが必要になります:

#!/bin/sh

ip=${1:-1.2.3.4}

if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
  for i in 1 2 3 4; do
    if [ $(echo "$ip" | cut -d. -f$i) -gt 255 ]; then
      echo "fail ($ip)"
      exit 1
    fi
  done
  echo "success ($ip)"
  exit 0
else
  echo "fail ($ip)"
  exit 1
fi

または、パイプの数が少ない場合でも:

#!/bin/sh

ip=${1:-1.2.3.4}

if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
  IFS=.
  set $ip
  for quad in 1 2 3 4; do
    if eval [ \$$quad -gt 255 ]; then
      echo "fail ($ip)"
      exit 1
    fi
  done
  echo "success ($ip)"
  exit 0
else
  echo "fail ($ip)"
  exit 1
fi

または、シェルが bash で、算術演算が苦手な場合は、クワッド検証に面倒な正規表現を使用できます。

#!/usr/bin/env bash

ip=${1:-1.2.3.4}

re='^(0*(1?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))\.){3}'
 re+='0*(1?[0-9]{1,2}|2([‌​0-4][0-9]|5[0-5]))$'

if [[ $ip =~ $re ]]; then
  echo "success"
else
  echo "fail"
fi

これは BRE で表現することもできますが、それは私の指で入力するよりも多くのタイピングです.

そして最後に、この機能を関数に入れるアイデアが気に入ったら:

#!/usr/bin/env bash

ip=${1:-1.2.3.4}

ipvalid() {
  # Set up local variables
  local ip=${1:-1.2.3.4}
  local IFS=.; local -a a=($ip)
  # Start with a regex format test
  [[ $ip =~ ^[0-9]+(\.[0-9]+){3}$ ]] || return 1
  # Test values of quads
  local quad
  for quad in {0..3}; do
    [[ "${a[$quad]}" -gt 255 ]] && return 1
  done
  return 0
}

if ipvalid "$ip"; then
  echo "success ($ip)"
  exit 0
else
  echo "fail ($ip)"
  exit 1
fi

これを行う方法はたくさんあります。ほんの少しだけお見せしました。


スクリプト Validating an IP Address in a Bash Scriptby Mitch Frazier は、あなたがやりたいことを行います:

function valid_ip()
{
local  ip=$1
local  stat=1

if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
    OIFS=$IFS
    IFS='.'
    ip=($ip)
    IFS=$OIFS
    [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
        && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
    stat=$?
fi
return $stat
}

Linux
  1. コンソールで大きなファイルをチェックする方法

  2. Bash For Loopsの「do」キーワードの目的は?

  3. In Echo {a..z}では特殊文字は何を表していますか?

  1. データベースに破損がないか確認してください

  2. Linux構成ファイルで構文エラーを確認してください

  3. Ubuntu 9.10 で openCV を確認する方法

  1. 引数が bash シェルで有効な日付かどうかを確認する

  2. 特定のコマンドの Bash 無視エラー

  3. Bash シェル スクリプト - フラグをチェックしてその値を取得する