首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash regex可以在linux上运行,但不能在solaris上运行

bash regex可以在linux上运行,但不能在solaris上运行
EN

Stack Overflow用户
提问于 2013-05-24 00:21:56
回答 2查看 840关注 0票数 4

下面的shell脚本在Linux中有效,但在Solaris上无效,

代码语言:javascript
复制
#!/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自由软件基金会,Inc.

代码语言:javascript
复制
$ ./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.

代码语言:javascript
复制
./regextest.sh -s 10.2.4.3
Invalid

GNU bash,版本3.2.51(1)-release (sparc-sun-solaris2.10)版权所有(C) 2007自由软件基金会,Inc.

代码语言:javascript
复制
./regextest.sh -s 10.2.4.3
Invalid

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-24 00:56:49

RegEx实现(GNU和POSIX)之间存在差异。

POSIX不理解\b,但GNU将其视为您所期望的词边界。

由于您一次只测试一个IP,请尝试将表达式从使用单词边界\b更改为使用^的开始和$字符串/行的结束,这两个字符串/行在大多数RegEx风格中都可以识别。

代码语言:javascript
复制
"^(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]?)$"
票数 4
EN

Stack Overflow用户

发布于 2013-05-24 00:56:40

不要纠结于正则表达式这个庞然大物,只需分别检查每个二进制八位数:

代码语言:javascript
复制
 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"

当然,可能会更慢,但参数检查不应该成为程序中的瓶颈。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16719091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档