如何检查shell脚本中IP地址的有效性,该范围0.0.0.0在to 的范围内255.255.255.255?
0.0.0.0
255.255.255.255
如果您使用的是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
如果您坚持使用POSIX Shell,则可以使用exprBRE而不是ERE来做基本相同的事情:
expr
#!/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
请注意,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
甚至更少的管道:
#!/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
再或者,如果您的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
这也可以用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
您可以通过多种方式执行此操作。我只给你看了几个。