2012-12-31 65 views
-2

我想做一个case语句,检查给定的参数,如果它的IP连接到它。我无法验证IP。IP正则表达式的情况下

case $1 in 
-h) 
    echo "usage: $0 <IP/DNS/IP range> <Port/Portrange>"; 
    ;; 
--help) 
    echo "usage: $0 <IP/DNS/IP range> <Port/Portrange>"; 
    ;; 
    [1-255].[0-255].[0-255].[0-255]) 

上面的正则表达式仅适用于1.1.1.1或相同的IP。

+0

DRY:使用'-h | - 帮助)'如果他们有相同的行为。 – tripleee

+0

此外,案件只支持通配符,而不是正则表达式,AFAIK。 – anishsane

+0

任何想法我怎么能做一个通配符,将使区别ip(*。*。*。*)和ip范围? (*。*。*。* - *。*。*。*) –

回答

1

字符类定义了单个字符。因此[1-255]匹配1-2或5或5范围内的单个字符(同样,sic)。

如果您想坚持case语法,正确的修复方法是清除不允许的变体,然后转到您的实际处理。

*[!.0-9]* | *.*.*.*.* | .* | *. | *[0-9][0-9][0-9][0-9]* \ 
    | *2[6-9][0-9]* | *25[6-9]*) 
    error ;; 
# require three dots 
*.*.*.*) ... Success scenario ... ;; 
*) error ;; 

(我敢肯定有一些角落情况下,我都忽略不动。)

为了简化代码,也许你可以在成功的情况下使用变量realip=false并将其设置为true,然后做esac之后的简单if $realip,并尽可能简单地将代码保留在case之内。

由此,由case支持的模式是glob模式,而不是真正的正则表达式。

+0

谢谢tripleee。但是这样做不会让我使用这个命令的主机名或IP范围,对吧? –

+1

没错,但是你需要检查一个有效的IP吗?让解析器处理用户输入,如果失败则退出。 – tripleee

+0

谢谢你,我设法做了一些事情。 还有一个问题,有没有办法从一个范围内生成所有的IP? 10.0.0.0-10.0.1.0?一个简单的方法。 –

相关问题