gho*_*oti 43
如果你正在使用bash,你可以为模式做一个简单的正则表达式匹配,而不验证四边形:
#!/usr/bin/env bash
ip=1.2.3.4
if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
echo "success"
else
echo "fail"
fi
Run Code Online (Sandbox Code Playgroud)
如果你坚持使用POSIX shell,那么你可以使用exprBRE而不是ERE来做基本相同的事情:
#!/bin/sh
ip=1.2.3.4
if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
echo "success"
else
echo "fail"
fi
Run Code Online (Sandbox Code Playgroud)
请注意,expr假设您的正则表达式锚定在字符串的左侧,因此初始化^是不必要的.
如果确认每个四边形小于256很重要,那么显然需要更多代码:
#!/bin/sh
ip=${1:-1.2.3.4}
if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
for i in 1 2 3 4; do
if [ $(echo "$ip" | cut -d. -f$i) -gt 255 ]; then
echo "fail ($ip)"
exit 1
fi
done
echo "success ($ip)"
exit 0
else
echo "fail ($ip)"
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
或者甚至用更少的管道:
#!/bin/sh
ip=${1:-1.2.3.4}
if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
IFS=.
set $ip
for quad in 1 2 3 4; do
if eval [ \$$quad -gt 255 ]; then
echo "fail ($ip)"
exit 1
fi
done
echo "success ($ip)"
exit 0
else
echo "fail ($ip)"
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
或者,如果您的shell是bash,如果您不喜欢算术,则可以使用繁琐的正则表达式进行四元验证:
#!/usr/bin/env bash
ip=${1:-1.2.3.4}
re='^(0*(1?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))\.){3}'
re+='0*(1?[0-9]{1,2}|2([??0-4][0-9]|5[0-5]))$'
if [[ $ip =~ $re ]]; then
echo "success"
else
echo "fail"
fi
Run Code Online (Sandbox Code Playgroud)
这也可以用BRE表示,但这比我手指中的打字更多.
最后,如果您喜欢将此功能放在函数中的想法:
#!/usr/bin/env bash
ip=${1:-1.2.3.4}
ipvalid() {
# Set up local variables
local ip=${1:-1.2.3.4}
local IFS=.; local -a a=($ip)
# Start with a regex format test
[[ $ip =~ ^[0-9]+(\.[0-9]+){3}$ ]] || return 1
# Test values of quads
local quad
for quad in {0..3}; do
[[ "${a[$quad]}" -gt 255 ]] && return 1
done
return 0
}
if ipvalid "$ip"; then
echo "success ($ip)"
exit 0
else
echo "fail ($ip)"
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
有很多方法可以做到这一点.我给你看了几个.
这个单一的正则表达式应该只验证 0.0.0.0 和 255.255.255.255 之间的那些地址:
#!/bin/bash
ip="1.2.3.4"
if [[ "$ip" =~ ^(([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\.){3}([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))$ ]]; then
echo "success"
else
echo "fail"
fi
Run Code Online (Sandbox Code Playgroud)
小智 8
使用ipcalc
$ ipcalc -cs 10.10.10.257 && echo vail_ip || echo invalid_ip
invalid_ip
Run Code Online (Sandbox Code Playgroud)
小智 6
Mitch Frazier的脚本“在Bash脚本中验证IP地址”完成了您想要做的事情:
Run Code Online (Sandbox Code Playgroud)function valid_ip() { local ip=$1 local stat=1 if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then OIFS=$IFS IFS='.' ip=($ip) IFS=$OIFS [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] stat=$? fi return $stat }