以下shell脚本在Linux中运行,但不会在Solaris上运行,
#!/usr/bin/bash while getopts ":s:" opt; do case $opt in s) # Check IP against regex if [[ "$OPTARG" =~ "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b" ]]; then IP=$OPTARG else echo "Invalid" exit 1 fi ;; esac done
Linux的:
GNU bash,版本3.2.25(1)-release(x86_64-redhat-linux-gnu)Copyright(C)2005 Free Software Foundation,Inc.
$ ./regextest.sh -s 10.2.4.3 $ $ ./regextest.sh -s 10.notaIP.10 Invalid
这是预期的结果。
但是在Solaris上,
GNU bash,版本3.00.16(1)-release(sparc-sun-solaris2.10)Copyright(C)2004 Free Software Foundation,Inc.
./regextest.sh -s 10.2.4.3 Invalid
GNU bash,版本3.2.51(1)-release(sparc-sun-solaris2.10)Copyright(C)2007 Free Software Foundation,Inc.
./regextest.sh -s 10.2.4.3 Invalid
谢谢
RegEx实现(GNU与POSIX)之间有区别。
POSIX不理解\b
但GNU把它当作你所希望的字边界 。
由于您一次只测试一个IP,所以请尝试将您的表达式从使用单词边界 \b
更改为使用^
开始和$
string /行的 结尾 ,这两种方法在大多数正则表达式中都可以识别。
"^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
而不是与正则表达式的怪异搏斗,只是分别检查每个八位字节:
IFS=. read abcd extra <<< "$OPTARG" [[ -n $extra ]] && { echo "Too many octets"; exit 1; } for octet in "$a" "$b" "$c" "$d"; do [[ $octet =~ [[:digit:]]+ ]] && (( octet <= 255 )) || { echo "Octet '$octet' must be a single byte"; exit 1 } } IP="$a.$b.$c.$d"
可能慢一点,当然,但是参数检查不应该是你程序中的瓶颈。