【发布时间】:2012-03-05 18:19:04
【问题描述】:
我正在尝试在破折号脚本中验证 IP 地址。我找到了很多方法来实现与 bash 相同的功能,例如 linuxjournal
基本上是用这个进行比较:
if [[ $ip =~ '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' ]]; then
do something
fi
有什么办法可以用破折号来达到同样的效果吗?
更新:这是完成我需要的最终脚本:
#In case RANGE is a network range (cidr notation) it's splitted to every ip from
# that range, otherwise we just keep the ip
if echo $RANGE | grep -E -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2}$'; then
IPS=`prips $RANGE -e ...0,255`
if [ "$?" != "0" ] ; then
echo "ERROR: Not a valid network range!"
exit 1
fi
elif echo $RANGE | grep -E -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'; then
IPS="$RANGE"
else
echo "$RANGE no is not a valid IP address or network range"
exit 1
fi
【问题讨论】:
-
IP 地址只是一个 32 位数字。您要求使用点分四进制表示法,但请记住十进制和十六进制表示法同样有效。
0x1020304和16909060与1.2.3.4相同。 -
我只需要验证人为错误,除了我和我的同事之外没有人会使用这个脚本,所以我可以选择一个符号并坚持下去。
-
关于你的最终正则表达式,你也可以用更短的形式来表示它:
^([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9]{1,2}$ -
您使用了许多不同的外部命令,而仅使用
dash内置命令就可以做到这一点。 (如果您对如何操作感到好奇,请参阅下面的回复。)
标签: shell sh dash-shell