Кратчайший путь к успеху - GNU grep, который также поддерживает PCRE:
if echo $CIDR | grep -qP "$REGEX"
then
echo "$CIDR OK!"
exit 0
else
echo "$CIDR NOT OK!"
exit 1
fi
grep's -q
отключает его и использует код выхода для определения успеха. -P
- это PCRE.
Но я должен отметить, что ваше регулярное выражение не полностью соответствует тому, что что-то является допустимым диапазоном CIDR; скорее, вы соответствуете действительному IP-адресу, за которым следует косая черта и число n ∈ 1-32. Дополнительное требование к диапазонам CIDR состоит в том, что младшие биты 32-n адреса равны нулю, например ::
IFS="./" read -r ip1 ip2 ip3 ip4 N <<< $CIDR
ip=$(($ip1 * 256 ** 3 + $ip2 * 256 ** 2 + $ip3 * 256 + $ip4))
if [ $(($ip % 2**(32-$N))) = 0 ]
then
echo "$CIDR OK!"
exit 0
else
echo "$CIDR NOT OK!"
exit 1
fi
Проверьте это, например, с помощью 127.0.0.0/24
, 127.1.0.0
, 127.1.1.0/24
.
Или более странные диапазоны: 10.10.10.8/29
, 127.0.0.0/8
, 127.3.0.0/10
, 192.168.248.0/21
.