2010-08-26 28 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