导语: 此 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
}