gpt4 book ai didi

regex - 网络掩码验证似乎无法在 bash 脚本中使用正则表达式,而 ip 验证工作正常

转载 作者:可可西里 更新时间:2023-11-01 11:46:16 27 4
gpt4 key购买 nike

我编写了如下简单的脚本来验证 IP 地址和网络掩码

#!/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 地址,但无法过滤掉无效的网络掩码。我已经使用如下不同的参数运行了上面的脚本,并且在脚本执行后也看到了下面的输出

$ ./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 地址验证的结果是预期的,但为什么它拒绝网络掩码,即使我输入有效的网络掩码 `255.255.255.0

有人知道我在网络掩码验证中遗漏了什么或我的脚本有什么问题吗?

最佳答案

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"
}

关于regex - 网络掩码验证似乎无法在 bash 脚本中使用正则表达式,而 ip 验证工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21746863/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com