• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:shellのワイルドカードについて)

シェルのワイルドカードについて

このQ&Aのポイント
  • IPアドレスを入力し、ワイルドカードの部分を判定するシェルのコードです。
  • 入力されたIPアドレスが[0-255].[0-255].[0-255].[0-255]の形式に一致する場合に、"OK"と表示します。
  • しかし、ワイルドカードの部分が正しく判定されない問題が発生しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

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

rapid6
質問者

補足

ご回答ありがとうございます。 すみません。もう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(否定)で書くとどのようになりますか? ご教授のほどよろしくお願いします。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.3

>の部分を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 \)

rapid6
質問者

お礼

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

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.1

そもそもシェルのワイルドカードで数値の範囲比較はできません。ワイルドカードでやるとすると、各パートが1桁の場合、2桁の場合、3桁で000-199台の場合、200-249の場合、250-255の場合をそれぞれ書かないといけないので、5x5x5x5=625 と625通りのパターンを書かないといけません。 また、bash拡張機能の [[ ]] 中でワイルドカード比較をするのは = でなく == です。 文字列を . で分解して、各パーツを数値比較する必要があります。expr、test を組み合わせて使うか、awk や perl 等を使うかしないと難しいでしょう。

すると、全ての回答が全文表示されます。