下面的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
doneLinux:
GNU bash,版本3.2.25(1)-release (x86_64-redhat-linux-gnu)版权所有(C) 2005自由软件基金会,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自由软件基金会,Inc.
./regextest.sh -s 10.2.4.3
InvalidGNU bash,版本3.2.51(1)-release (sparc-sun-solaris2.10)版权所有(C) 2007自由软件基金会,Inc.
./regextest.sh -s 10.2.4.3
Invalid谢谢
发布于 2013-05-24 00:56:49
RegEx实现(GNU和POSIX)之间存在差异。
POSIX不理解\b,但GNU将其视为您所期望的词边界。
由于您一次只测试一个IP,请尝试将表达式从使用单词边界\b更改为使用^的开始和$字符串/行的结束,这两个字符串/行在大多数RegEx风格中都可以识别。
"^(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]?)$"发布于 2013-05-24 00:56:40
不要纠结于正则表达式这个庞然大物,只需分别检查每个二进制八位数:
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"当然,可能会更慢,但参数检查不应该成为程序中的瓶颈。
https://stackoverflow.com/questions/16719091
复制相似问题