2012-02-14 11 views
0

ダッシュスクリプト内のIPアドレスを検証しようとしています。このようlinuxjournalダッシュ(in bash)でipを検証する

のようにbashのと同じことを達成するための多くの方法が基本的には何んである私を見つけたこれを使用して比較ですです:

if [[ $ip =~ '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' ]]; then 
    do something 
fi 

はダッシュで同じを取得する方法はありますか?

UPDATE:は、これは私が必要なものを行い、最終的なスクリプトです:

#In case RANGE is a network range (cidr notation) it's splitted to every ip from 
# that range, otherwise we just keep the ip 
if echo $RANGE | grep -E -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2}$'; then 
    IPS=`prips $RANGE -e ...0,255` 
    if [ "$?" != "0" ] ; then 
     echo "ERROR: Not a valid network range!" 
     exit 1 
    fi 
elif echo $RANGE | grep -E -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'; then 
    IPS="$RANGE" 
else 
    echo "$RANGE no is not a valid IP address or network range" 
    exit 1 
fi 
+0

IPアドレスはちょうど32ビットの数字です。 dotted-quad記法を求めていますが、10進法と16進法も有効です。 '0x1020304'と' 16909060'は '1.2.3.4'と同じです。 – ghoti

+0

私は人間のエラーの検証だけが必要です。私と私の同僚以外の誰もこのスクリプトを使用しないので、私は表記法を選択してそれに固執することができます。 – user322049

+0

あなたの最終的な正規表現に関しては、少し短く表現することもできます: '^([0-9] {1,3} \。){3} [0-9] {1,3} \/[0-9] {1,2} $ ' – ghoti

答えて

0

を使用すると、検証文字列に満足していると仮定:

 
$ s='[0-9]\{1,3\}' 
$ echo $ip | grep > /dev/null "^$s\.$s\.$s\.$s$" && 
    echo $ip is valid 

注意これはのような無効なIPアドレスを受け入れること876.3.4.5

ipを検証するには、正規表現を使用することは本当に便利ではありません。行うには相対的な簡単な事がある:それは正規表現よりも冗長になりますが、あなたは、caseステートメントを構築することができ

 
IFS=. read a b c d << EOF 
$ip 
EOF 

if (for i in a b c d; do 
     eval test \$$i -gt 0 && eval test \$$i -le 255 || exit 1 
    done 2> /dev/null) 
then 
    echo $ip is valid 
fi 
+0

唯一の問題は、正規表現を評価する(egrepを使用する)ために-Eフラグが必要なことです。 ありがとうございました – user322049

+0

拡張正規表現はs = '[0-9] {1,3}'を使用する場合に必要です。大括弧をエスケープすると、基本的な正規表現が機能するはずです。 (あ、あなたは私の編集の前にあなたのコメントをしました...) –

+0

また、リダイレクトの問題は少し奇妙です。代わりに 'egrep -q" regex "'を使ってください。 – ghoti

1

。一方、外部プロセスの生成を避けると、読み込みと保守を容易にしてブートすることができます。

if case $ip in 
    # Invalid if it contains any character other than number or dot 
    # Invalid if it contains more than three dots 
    # Invalid if it contains two adjacent dots 
    # Invalid if it begins with a non-number 
    # Invalid if it ends with a non-number 
    *[!.0-9]* | *.*.*.*.* | *..* | [!0-9]* | *[!0-9]) false ;; 
    # Invalid if it contains a number bigger than 255: 
    # 256-259 or 260-299 or 300-999 or four adjacent digits 
    *25[6-9]* | *2[6-9][0-9]* | *[3-9][0-9][0-9]* | *[0-9][0-9][0-9][0-9]*) false;; 
    # Verify that it contains three dots 
    *.*.*.*) true ;; 
    # Failing that, invalid after all (too few dots) 
    *) false ;; 
esac; then 
    echo "$ip" is valid 
fi 

お知らせif文の条件として、(真または偽のどちらかを返す)case文のファンキー使用。それはここ

+0

私はそのような関数をデバッグするのが大好きではないでしょう...:/ – zrajm

0

未満256は任意外部コマンドを使用していない小dashシェル関数であることが各オクテットを必要とし、その中で

これは、正規表現よりも若干厳格であるか否かを調べますIPv4アドレスは有効です。アドレスが正しくフォーマットされている場合はtrueを返し、そうでない場合はfalseを返します。

私は私のコメントで魔法を説明しようとしました。

valid_ip() { 
    local IP="$1" IFS="." PART   # make vars local, get arg, set $IFS 
    set -- $IP       # split on $IFS, set $1, $2 etc. 
    [ "$#" != 4 ] && return 1   # BAD: if not 4 parts 
    for PART; do       # loop over $1, $2 etc. 
     case "$PART" in 
      *[!0-9]*) return 1   # BAD: if $PART contains non-digit 
     esac 
     [ "$PART" -gt 255 ] && return 1 # BAD: if $PART > 255 
    done 
    return 0        # GOOD: nothing bad found 
} 

この機能を使用すると、あなたのIPアドレスをテストすることができます。 IPアドレスが無効な場合はスクリプトを中止します。

if valid_ip "$IP"; then 
    echo "ERROR: IP address '$IP' is invalid" >&2 
    exit 4 
fi 
関連する問題