networking掩码validation似乎不工作在bash脚本中使用正则expression式,而IPvalidation工作正常

我写了一个简单的脚本来validationIP地址和networking掩码如下

#!/bin/bash validFormatIP() { echo $1 | grep -w -E -o '^(25[0-4]|2[0-4][0-9]|1[0-9][0-9]|[1]?[1-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' > /dev/null if [ $? -eq 0 ] then echo "Valid ipaddress" else echo "Inalid ipaddress" fi } validNetMask() { echo $1 | grep -w -E -o '^(254|252|248|240|224|192|128)\\.0\\.0\\.0|255\\.(254|252|248|240|224|192|128|0)\\.0\\.0|255\\.255\\.(254|252|248|240|224|192|128|0)\\.0|255\\.255\\.255\\.(254|252|248|240|224|192|128|0)' > /dev/null if [ $? -eq 0 ] then echo "Valid netmask" else echo "Invalid netmask" fi } setIpAddress() { ip_address=`echo $1 | awk -F= '{print $2}'` validFormatIP $ip_address } setNetMask() { ip_address=`echo $1 | awk -F= '{print $2}'` validNetMask $ip_address } let "n_count=0" netmask="" let "i_count=0" ipaddess="" while getopts ":i:n:" OPTION do case $OPTION in n) netmask="Netmask=$OPTARG" let "n_count+=1" ;; i) ipaddess="IpAddess=$OPTARG" let "i_count+=1" ;; ?) echo "wrong command syntax" ;; esac done if [ $i_count -eq 1 ] then setIpAddress $ipaddess exit 0 fi if [ $n_count -eq 1 ] then setNetMask $netmask exit 0 fi 

使用上面的结果我已经成功地筛选出无效的IP地址,但不能过滤无效的networking掩码。我已经运行了上面的脚本以不同的参数如下,并看到下面的输出后脚本执行

 $ ./script.bash -i 192.168.0.1 Valid ipaddress $./script.bash -i 255.255.0.0 Inalid ipaddress $./script.bash -n 255.255.255.0 Invalid netmask 

正如你所看到的上面的输出IP地址validation的结果是预期的,但为什么它拒绝networking掩码,即使我input有效的networking掩码`255.255.255.0

任何人有想法,我想念在networking掩码validation或在我的脚本错误?

grep不会加倍逃脱点等等,所以这将工作:

 validNetMask() { echo $1 | grep -w -E -o '^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)' > /dev/null if [ $? -eq 0 ]; then echo "Valid netmask" else echo "Invalid netmask" fi } 

最好使用这个简洁的版本:

 validNetMask() { grep -E -q '^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)' <<< "$1" && echo "Valid netmask" || echo "Invalid netmask" } 

矿:

 validate_netmask () { n_masks=(${1//./ }) [ "${#n_masks[@]}" -ne 4 ] && return 1 for i in ${1//./ }; do bits=$(echo "obase=2;ibase=10;$i" | bc) pre=$((8-${#bits})) if [ "$bits" = 0 ]; then zeros=00000000 elif [ "$pre" -gt 0 ]; then zeros=$(for ((i=1;i<=$pre;i++)); do echo -n 0; done) fi b_mask=$b_mask$zeros$bits unset zeros done if [ $b_mask = ${b_mask%%0*}${b_mask##*1} ]; then return 0 else return 1 fi }