如果您使用的是bash,则可以对模式进行简单的正则表达式匹配,而无需验证四边形:
#!/usr/bin/env baship=1.2.3.4if [[ $ip =~ ^[0-9]+.[0-9]+.[0-9]+.[0-9]+$ ]]; then echo "success"else echo "fail"fi
如果您坚持使用POSIX Shell,则可以使用
exprBRE而不是ERE来做基本相同的事情:
#!/bin/ship=1.2.3.4if 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/ship=${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 0else echo "fail ($ip)" exit 1fi甚至更少的管道:
#!/bin/ship=${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 0else echo "fail ($ip)" exit 1fi再或者,如果您的shell是bash,那么您可以在不喜欢算术的情况下使用繁琐的正则表达式进行四边形验证:
#!/usr/bin/env baship=${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 baship=${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 0else echo "fail ($ip)" exit 1fi您可以通过多种方式执行此操作。我只给你看了几个。



