プロが教えるわが家の防犯対策術!

こんばんは。
shellを書いておりましたが、
ワイルドカードの部分で躓いてしまいましたので、
なにとぞご教授頂ければと思います。

【シェルの内容】
IPアドレスを入力。
IPアドレスの範囲が[0-255].[0-255].[0-255].[0-255]であれば"OK"を表示

このワイルドカードの部分がうまく判定されないのです。
よろしくお願いします。


#/bin/sh

echo -n "To what is IPaddress set ? "
read IPADDR

if [[ [0-255].[0-255].[0-255].[0-255] = $IPADDR ]]
then
echo -n "OK!"
fi

exit 0

A 回答 (3件)

そもそもシェルのワイルドカードで数値の範囲比較はできません。

ワイルドカードでやるとすると、各パートが1桁の場合、2桁の場合、3桁で000-199台の場合、200-249の場合、250-255の場合をそれぞれ書かないといけないので、5x5x5x5=625 と625通りのパターンを書かないといけません。
また、bash拡張機能の [[ ]] 中でワイルドカード比較をするのは = でなく == です。

文字列を . で分解して、各パーツを数値比較する必要があります。expr、test を組み合わせて使うか、awk や perl 等を使うかしないと難しいでしょう。
    • good
    • 0

expr と test を使うとすると、



read A

A1=`expr "$A" : '\([0-9]\+\)\.'`
A2=`expr "$A" : '[0-9]\+\.\([0-9]\+\)\.'`
A3=`expr "$A" : '[0-9]\+\.[0-9]\+\.\([0-9]\+\)\.'`
A4=`expr "$A" : '[0-9]\+\.[0-9]\+\.[0-9]\+\.\([0-9]\+\)$'`

if test -n "$A1" -a -n "$A2" -a -n "$A3" -a -n "$A4" &&
test "$A1" -le 255 -a "$A2" -le 255 -a "$A3" -le 255 -a "$A4" -le 255
then echo OK
else echo NG
fi

この回答への補足

ご回答ありがとうございます。

すみません。もう1点質問させてください。
if test -n "$A1" -a -n "$A2" -a -n "$A3" -a -n "$A4" &&
test "$A1" -le 255 -a "$A2" -le 255 -a "$A3" -le 255 -a "$A4" -le 255
の部分をNot(否定)で書くとどのようになりますか?

ご教授のほどよろしくお願いします。

補足日時:2006/05/16 12:58
    • good
    • 0

>の部分をNot(否定)で書くとどのようになりますか?



if で使うなら、then 部分と else 部分の内容を逆に書けばいいです。then 部分が空になるなら : とコロンを書いておきます。

while の条件で使うなら、この手は使えないので、それぞれのtestの条件を !( ) で囲んで、

test \! \( -n "$A1" -a -n "$A2" -a -n "$A3" -a -n "$A4" \) || test \! \( "$A1" -le 255 -a "$A2" -le 255 -a "$A3" -le 255 -a "$A4" -le 255 \)
    • good
    • 0
この回答へのお礼

なるほどぉ。ご回答どうもありがとうございました。

お礼日時:2006/05/16 23:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!