shell 函数实现检测字符串是否为合法的 IPv4 地址

导语: 此 shell 函数仅以记录之前的劳动果实,并分享给他人,个人原创,欢迎使用并给予 bug 的反馈.

#!/bin/bash
isLegalIPv4Address ()
{
  local s=
  local isStrict=0
  function _checkNumberRange ()
  {
    local x
    for x in $@
    do
      if [ $x -gt 255 ]; then
        echo "$s 不是合法IPv4地址. 因为它包含超出范围的数字段(第1段的范围是: 1~255; 第2/3/4段的范围: 0~255)."
        return 1
      fi
      if [ $isStrict -eq 1 ]; then
        [ $x -ne 0 ] && [ "p${x:0:1}" == "p0" ] && echo "$s 不是合法 IPv4 地址.因为当前为严格模式,且它含有前缀0的数字段 $x." && return 1
      fi
    done
    return 0
  }
  function _usage ()
  {
    echo "${FUNCNAME[1]} [-h|-s] IP1[,IP2,...]"
    echo " -s, 开启严格模式,此时若某个非零数字前面有前缀0时该IP无效"
    echo " -h, 输出此帮助说明"
  }
  if [ $# -eq 0 ] || [ "x${1:0:2}" == "x-h" -o "x${1:0:2}" == "x-H" ]; then
    _usage && return
  fi
  [ $# -ge 1 ] && [ "x${1:0:2}" == "x-s" -o "x${1:0:2}" == "x-S" ] && isStrict=1 && shift
  for s in $(echo $@ | sed 's/,/ /g' )
  do
    if [ "x${s//[.0-9]/}" != "x" ]; then
      echo "$s 不是合法 IPv4 地址. 因为它包含非数字字符(分隔符'.'除外)" && continue
    fi
    local items=($(sed 's/\./ /g' <<< $s))
    if [ ${#items[@]} -ne 4 ]; then
      echo "$s 不是合法的 IPv4 地址.合法的 IPv4 地址只能被句点号(.)分隔成4部分" && continue
    fi
    if [ ${items[0]} -eq 0 ]; then
      echo "$s 不是合法IPv4地址. 合法的 IPv4 地址 第1段不能是0" && continue
    fi
    _checkNumberRange ${items[@]}
    [ $? -eq 0 ] && echo "$s 是合法 IPv4 地址."
  done
}

猜你喜欢

转载自blog.csdn.net/liudglink/article/details/78090979