2010-08-26 30 views

回答

1

不要重新发明轮子。

use strict; 
use warnings; 
use Regexp::Common qw/net/; 
# see http://search.cpan.org/dist/Regexp-Common/lib/Regexp/Common/net.pm 

my $Address = '...'; 
# adapted from the module's synopsis 
for ($Address) { 
    /$RE{net}{IPv4}/  and print "Dotted decimal IP address"; 
    /$RE{net}{IPv4}{hex}/ and print "Dotted hexadecimal IP address"; 
    /$RE{net}{IPv4}{oct}{-sep => ':'}/ and 
          print "Colon separated octal IP address"; 
    /$RE{net}{IPv4}{bin}/ and print "Dotted binary IP address"; 
    /$RE{net}{MAC}/  and print "MAC address"; 
    /$RE{net}{MAC}{oct}{-sep => " "}/ and 
          print "Space separated octal MAC address"; 
} 

使用你所需要的一个。

如果您无法安装模块,那么只需潜入模块的代码并获取正确的正则表达式即可使用,具体取决于您希望匹配的IP地址类型。

或者,只要使用类似上面的内容,并调用相同的子地址,如果地址匹配您想要的任何符号或沿着这些线的东西。

从shell脚本利用这将是沿着线:

return perl -e'use Regexp::Common qw/net/;$ip=shift;if ($ip =~ /$RE{net}{IPv4}/){exit 0}else{exit 1}' "$Address"; 

以上将取代你的完整的“案例”块。

同样,如果您需要在perl脚本调用中内联正则表达式,您可以通过阅读模块的代码来实现。

+0

不好,我需要这个语法我的shell脚本的一部分 – lidia 2010-08-26 12:53:53

+0

读该位“如果你不能安装模块...“:只要阅读模块的代码,并使用正确的正则表达式来获得你想要的。如果您需要,我将使用IPv4的正则表达式更新它 – mfontani 2010-08-26 13:02:45

1
check(){ 
    case "$1" in 
    [0-9]|[0-9][0-9]|[0-1][0-9][0-9]|2[0-4][0-9]|25[0-5]) echo "0";; 
    *) echo "1";; 
    esac 
} 
ip="$1" 
OIFS="$IFS" 
IFS="." 
set -- $ip 
result="$(check $1)$(check $2)$(check $3)$(check $4)" 
case "$result" in 
    "0000") echo "IP $ip Ok";; 
    *) echo "IP $ip not ok";; 
esac 
IFS="$OLDIFS" 
+1

在0-255范围内的差不多三分之一(例如106和239)。为什么不这样做:在[0-9] | [0-9] [0-9] | [0-2] [0-9] [0-9])(($ 1)中检查(){case“$ 1” > = 0 && $ 1 <= 255))&& echo“0”||回声“1”;; *)echo“1”;; ESAC; }'验证只有数字并且它们落在适当的范围内? – 2010-08-27 04:10:11

+0

你是对的。增加了更多检查。不用整数比较方法。 – ghostdog74 2010-08-27 06:48:47

0

击> = 3.2版(这可以大大缩短了):

valid() { 
    if [[ $1 =~ ^[[:digit:]]+$ ]] && 
     (($1 >= 0 && $1 <= 255)) 
    then 
     echo "0" 
     return 0 
    else 
     echo "1" 
     return 1 
    fi 
} 

saveIFS=$IFS 
IFS='.' 
ip=($1) 
IFS=$saveIFS 
for octet in ${ip[@]} 
do 
    if ! valid $octet > /dev/null 
    then 
     valid=1 
    fi 
done 
[[ $valid != 1 ]] && echo "Good address" || echo "Bad address" 
+0

ip =($ 1)在ksh中无效 – lidia 2010-09-02 11:20:31

1

拆分而不被逐位移触摸IFS和避免复杂的检查地址:

declare -a part=(${ip//\./ }) 
declare -i valid=0 

for p in ${part[@]}; do 
    if [[ $p =~ ^[[:digit:]]+$ ]] ; then 
    ((valid += p>>8)) 
    else 
    ((valid++)) 
    fi 
done 

if [ $valid -eq 0 ] ; then 
    echo -e "$ip  OK" 
else 
    echo -e "$ip NOT OK" 
fi 
+0

该脚本如何知道数字是否超过255,因为256 num不是有效数字 – lidia 2010-08-31 11:50:24

+0

此脚本无法在ksh中运行 – lidia 2010-09-02 11:20:06

0

这里是一种更简单,更简单的方法。它只检查基本结构,但在某些情况下它已足够。

VALID=$(echo $IP | egrep '^[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}$'); 

if [ ! -n "$VALID" ]; then 
    echo "This IP ($IP) isn't valid. Please check it and try again."; 
    exit 0; 
fi; 
0

保存IP地址ip_server并使用下面的代码检查:

if [[ "$ip_server" =~ ^([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})$ ]] 
then 
    for ((i=1; i<${#BASH_REMATCH[@]}; ++i)) 
    do 
     ((${BASH_REMATCH[$i]} &2; exit 1; } 
    done 
else 
     echo "Wrong IP address" >&2 
     exit 1; 
fi