我正在尝试在破折号脚本中验证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
答案 0 :(得分:1)
您可以构建case
语句,尽管它比正则表达式更冗长。另一方面,您可以避免产生任何外部进程,并且可能更容易阅读和维护以进行引导。
if case $ip in
# Invalid if it contains any character other than number or dot
# Invalid if it contains more than three dots
# Invalid if it contains two adjacent dots
# Invalid if it begins with a non-number
# Invalid if it ends with a non-number
*[!.0-9]* | *.*.*.*.* | *..* | [!0-9]* | *[!0-9] ) false ;;
# Invalid if it contains a number bigger than 255:
# 256-259 or 260-299 or 300-999 or four adjacent digits
*25[6-9]* | *2[6-9][0-9]* | *[3-9][0-9][0-9]* | *[0-9][0-9][0-9][0-9]* ) false;;
# Verify that it contains three dots
*.*.*.* ) true ;;
# Failing that, invalid after all (too few dots)
*) false ;;
esac; then
echo "$ip" is valid
fi
注意在case
语句中使用if
语句(返回true或false)的时髦。
这比正则表达式稍微严格一点,因为它要求每个八位字节小于256.
答案 1 :(得分:0)
假设您对验证字符串感到满意:
$ s='[0-9]\{1,3\}' $ echo $ip | grep > /dev/null "^$s\.$s\.$s\.$s$" && echo $ip is valid
请注意,这会接受无效的IP地址,如876.3.4.5
要验证ip,使用正则表达式真的不方便。一个相对容易的事情是:
IFS=. read a b c d << EOF $ip EOF if ( for i in a b c d; do eval test \$$i -gt 0 && eval test \$$i -le 255 || exit 1 done 2> /dev/null ) then echo $ip is valid fi
答案 2 :(得分:0)
这是一个小dash
shell函数,它不使用任何外部命令,并检查IPv4地址是否有效。如果地址格式正确,则返回true,否则返回false。
我试图在我的评论中解释这个魔术。
valid_ip() {
local IP="$1" IFS="." PART # make vars local, get arg, set $IFS
set -- $IP # split on $IFS, set $1, $2 etc.
[ "$#" != 4 ] && return 1 # BAD: if not 4 parts
for PART; do # loop over $1, $2 etc.
case "$PART" in
*[!0-9]*) return 1 # BAD: if $PART contains non-digit
esac
[ "$PART" -gt 255 ] && return 1 # BAD: if $PART > 255
done
return 0 # GOOD: nothing bad found
}
使用此功能,您可以测试您的IP地址,例如如果IP地址无效,则中止您的脚本:
if valid_ip "$IP"; then
echo "ERROR: IP address '$IP' is invalid" >&2
exit 4
fi