导语: 此 shell 函数仅以记录之前的劳动果实,并分享给他人,个人原创,欢迎使用并给予 bug 的反馈.
#!/bin/bash
isLegalIPv4 ()
{
local myLocation=${FUNCNAME}
local isStrict=0
local s=
function usage ()
{
echo -e "\nUsage:\n ${myLocation} [-h]|[-s] IP1[,IP2,...]\n"
echo -e " -s,开启严格模式,此时若某个非零数字前面有前缀0时该IP无效"
echo -e " -h,输出此说明方式\n"
}
function hasNotPrefixZero ()
{
local x=
for x in $(echo $@ | sed 's/\./ /g')
do
[ "${x:0:1}" == "0" ] && [ $x -ne 0 ] && return 1
done
return 0
}
function isDigitCharAll ()
{
echo $1 | sed 's/\.//g' | grep -E "^[0-9]+$" >&/dev/null
return $?
}
function checkNumberRange ()
{
local arr=($(echo $1 | sed 's/\./ /g'))
if [ ${#arr[@]} -ne 4 ]; then
echo "$1 不是合法的 IPv4 地址.合法的 IPv4 地址只能 有3个分割符'.'"
return 1
fi
if [ ${arr[0]} -eq 0 ]; then
echo "$1 不是合法IPv4地址. 因为它包含超出范围的数字段(第1段的范围是: 1~255; 第2/3/4段的范围: 0~255)."
return 1
fi
for x in ${arr[@]}
do
if [ $x -gt 255 ]; then
echo "$1 不是合法IPv4地址. 因为它包含超出范围的数字段(第1段的范围是: 1~255; 第2/3/4段的范围: 0~255)."
return 1
fi
done
return 0
}
[ $# -eq 0 ] && usage && return
[ $# -ge 1 ] && [ "x$1" == "x-h" -o "x$1" == "x-H" ] && usage && return
[ $# -ge 1 ] && [ "x$1" == "x-s" -o "x$1" == "x-S" ] && isStrict=1 && shift
for s in $(echo $@ | sed 's/,/ /g')
do
isDigitCharAll $s
[ $? -ne 0 ] && echo "$s 不是合法 IPv4 地址. 因为它包含非数字字符(分隔符'.'除外)" && continue
checkNumberRange $s
[ $? -ne 0 ] && continue
if [ $isStrict -eq 1 ]; then
hasNotPrefixZero $s
[ $? -ne 0 ] && echo "$s 不是合法 IPv4 地址. 当前为严格模式,同时它含有前缀0的数字段." && continue
fi
echo "$s 是合法 IPv4 地址."
done
}