Bash 检查 CIDR 地址是否有效

Mog*_*rDK 1 regex validation bash cidr

我似乎无法理解这个问题。我有一个正则表达式,用于检查字符串是否包含有效的 CIDR 表示法地址。

(((?:25[012345]|2[0-4]\d|1?\d\d?)\.){3}(?:25[012345]|2[0-4]\d|1?\d\d?))(?:\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\d])

这个东西可以在 Perl、PHP、Javascript 中运行,并x.x.x.x/8y.y.y.y/32.

我尝试将它们更改\d[[:digit:]]Nothing \\d:(

用于测试的测试脚本:

#!/bin/bash

if [ "$1" = "" ]
then
    echo "Usage: $( basename $0) 123.456.789.0/12"
    exit
fi
REGEX1='(((?:25[012345]|2[0-4]\d|1?\d\d?)\.){3}(?:25[012345]|2[0-4]\d|1?\d\d?))(?:\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\d])'
REGEX2='(((?:25[012345]|2[0-4]\\d|1?\\d\\d?)\.){3}(?:25[012345]|2[0-4]\\d|1?\\d\\d?))(?:\\/([1-9]|[1-2][0-9]|3[0-2]))(?![.\\d])'
REGEX3='(((?:25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?)\\.){3}(?:25[012345]|2[0-4][[:digit:]]|1?[[:digit:]][[:digit:]]?))(?:\\/([1-9]|[1-2][0-9]|3[0-2]))(?![.[[:digit:]]])'

REGEX=$REGEX3

if [[ $1 =~ $REGEX ]]
then
    echo "$1 OK!"
else
    echo "$1 Not OK! $REGEX"
fi
Run Code Online (Sandbox Code Playgroud)

有什么想法可以从这里去哪里吗?

更新。添加工作脚本:

#!/bin/bash

if [ "$1" = "" ]
then
    echo "Usage: $( basename $0) 123.456.789.0/12"
    exit
fi

REGEX='(((25[0-5]|2[0-4][0-9]|1?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|1?[0-9][0-9]?))(\/([8-9]|[1-2][0-9]|3[0-2]))([^0-9.]|$)'

if [[ $1 =~ $REGEX ]]
then
    echo "$1 OK!"
else
    echo "$1 Not OK!"
fi

if echo $1 | grep -Pq $REGEX
then
    echo "grep $1 OK!"
else
    echo "grep $1 Not OK!"
fi
Run Code Online (Sandbox Code Playgroud)

Sim*_*ine 6

成功的最短路径是 GNU grep,它也支持 PCRE:

\n
#!/bin/sh\n\nif echo "$CIDR" | grep -qP "$REGEX"\nthen\n  echo "$CIDR OK!"\n  exit 0\nelse\n  echo "$CIDR NOT OK!"\n  exit 1\nfi\n
Run Code Online (Sandbox Code Playgroud)\n

grep-q使其保持沉默并依赖退出代码来确定成功。-P是PCRE。

\n

但我应该指出,您的正则表达式并不完全匹配有效的 CIDR 范围;相反,您匹配的是一个有效的 IP 地址,后跟一个斜杠和一个数字n \xe2\x88\x88 1-32。CIDR 范围的另一个要求是32-n低位为零,例如:

\n
#!/bin/sh\n\nvalid_cidr() {\n  CIDR="$1"\n\n  # Parse "a.b.c.d/n" into five separate variables\n  IFS="./" read -r ip1 ip2 ip3 ip4 N <<< "$CIDR"\n\n  # Convert IP address from quad notation to integer\n  ip=$(($ip1 * 256 ** 3 + $ip2 * 256 ** 2 + $ip3 * 256 + $ip4))\n\n  # Remove upper bits and check that all $N lower bits are 0\n  if [ $(($ip % 2**(32-$N))) = 0 ]\n  then\n    return 0 # CIDR OK!\n  else\n    return 1 # CIDR NOT OK!\n  fi\n}\n
Run Code Online (Sandbox Code Playgroud)\n

127.0.0.0/24使用例如, 127.1.0.0,进行测试127.1.1.0/24

\n

或者更多奇数范围:10.10.10.8/29, 127.0.0.0/8, 127.3.0.0/10, 192.168.248.0/21

\n