源代码:(及测试用例)
#!/bin/bash
ip_in_subnet() {
ip=$1
subnet=$2
IFS='/' read -r network cidr <<< "$subnet"
# 将IP地址转换为32位整数
ip_decimal=$(IFS=. read a b c d <<< $ip; echo $((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d)))
# 计算子网地址和掩码的32位整数
IFS=. read -r -a network_octets <<< "$network"
network_decimal=$((${network_octets[0]} * 256 ** 3 + ${network_octets[1]} * 256 ** 2 + ${network_octets[2]} * 256 + ${network_octets[3]}))
cidr_decimal=$((2 ** (32 - $cidr) - 1))
subnet_decimal=$(($network_decimal + $cidr_decimal))
if [ $ip_decimal -ge $network_decimal ] && [ $ip_decimal -le $subnet_decimal ]; then
echo "$ip 在子网 $subnet 中"
else
echo "$ip 不在子网 $subnet 中"
fi
}
# 判断IP地址是否在子网中
ip_in_subnet "192.168.1.5" "192.168.1.0/24"
ip_in_subnet "192.168.2.7" "192.168.1.0/24"