以下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) 版权所有(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) 版权所有(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) 版权所有(C)2007 Free Software Foundation,Inc。
./regextest.sh -s 10.2.4.3
Invalid
由于
答案 0 :(得分:4)
RegEx实现(GNU与POSIX)之间存在差异
POSIX不理解\b
但是GNU会像你期望的那样对待一个单词边界。
由于您一次只测试一个IP,请尝试将表达式从使用字边界 \b
更改为 start of {{1}和 ^
字符串/行的结尾,它们在大多数RegEx风格中都被识别。
$
答案 1 :(得分:2)
不要与正则表达式的怪异搏斗,而是单独检查每个八位字节:
IFS=. read a b c d 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"
可能更慢,当然,但是参数检查不应该是你程序中的瓶颈。