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

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

shellのワイルドカードについて

こんばんは。 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

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答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% (4848/10262)
回答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% (4848/10262)
回答No.1

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

関連するQ&A

  • shell 変数について

    お世話になっております。 たびたびすみません。 shellプログラミングで質問です。 以下のようなプログラムを作成したところ、 引数に2147483648以上の数値を与えて実行すると 変数に代入される値が-マイナスとなり、 おかしくなってしまいます。 シェル変数の上限は2147483647なのでしょうか? だとしたら、これ以上の数値を代入することはできないのでしょうか。 お手数ですが、よろしくお願いいたします。 #!bin/sh firstno=$1 echo "do you make a file?(y/n)" read ans if [ $ans = "y" ]; then sed -e 's/AAA/aaa/' aaa.csv >> aaaaaa.csv firstno=`expr $firstno + 1` echo "next no is \"$firstno\"" fi

  • Shellスクリプトについて

    趣味で自宅にubuntuを入れて、Linuxの本を片手にもって勉強している学生です それでshellスクリプトでテストの結果を入力したら自動的にA.B.Cと認識するプログラムを作ったんですけど $ ./test ./test: line 4: echoPlease input your record: command not found 12 ./test: line 7: case12in: command not found ./test: line 8: syntax error near unexpected token `)' ./test: line 8: `100 | 99 | 98 | 97 | 96 | 95 | 94 | 93 | 92 | 91| 90 ) echo"A";;' なぜコマンドが見つからないのかわかりません ちなみにプログラムは #!/bin/sh echo"Please input your record" read record case"$record"in 100|99|98|97|96|95|94|93|92|91|90) echo"A";; 89|88|87|86|85|84|83|82|81|80) echo"B";; 79|78|77|76|75|74|73|72|71|70) echo"C";; 69|68|67|66|65|64|63|62|61|60) echo"D";; 59|58|57|56|55|54|53|52|51|50) echo"E";; 49|48|47|46|45|44|43|42|41|40) echo"F";; 39|38|37|36|35|34|33|32|31|30) echo"G";; 29|28|27|26|25|24|23|22|21|20) echo"H";; 19|18|17|16|15|14|13|12|11|10) echo"I";; 9|8|7|6|5|4|3|2|1|0) echo"J";; *)echo"sorry,answer not recognized";; esac exit もしどこか間違っていたら教えてください

  • shellスクリプトから別のshellスクリプトを呼び出す方法

    今現在VineLinux4.1をサーバとして起動させております。 その関係もありまして維持としてシェルを動かす事はある意味必須の状態です。 本題はAと言うスクリプトからBと言うスクリプトを呼び出す方法がわかりません。 試してみた方法はsourceで呼び出す方法です。 A.shの中身を以下とすると #!bin/bash echo ="B.shを呼び出します" source B.sh echo ="シェルスクリプトを終了します" exit 0 上記のようにした場合、最初のecho文は出力され、B.shの内容を一通り終えると最後のechoは出力されずA.shは完了しません。 ごくごく基本的なことかもしれませんが、うまく検索にも引っ掛けられなかったので、ご質問させていただきます。 よろしくお願い致します。

  • readコマンドによる\の読み込み

    Solaris8 Bshellにてシェルを作っています。 ------------------------ #!/bin/sh read ANS echo ANS exit 0 ------------------------ こんな感じでANSに文字列を入力させたいのですが \を入力するとechoで出力されません。 \がバックスラッシュの役目をしているのはわかるのですが 対処としてはどうすればよいのでしょうか? \\にすればいいのもわかるのですが、変換がうまくできませんでした・・・ よろしくお願いいたします。

  • exitコマンドの後の変数について(シェル)

    シェルをはじめたばかりの初心者です。 以下のようなシェルがあります。exit後のexit_cancelという変数は何に使われるのでしょうか? exitしてしまえばシェルは終了してしまうので exit_cancelという変数は関係ない気もするのですが・・・ ちなみにexit_cancelという変数はシェル内には どこにも定義していません。 どなたか教えて頂けないでしょうか? 何卒よろしくお願い致します。 case "${opt_exec}" in "z") ;;  *)     print -n "本当によろしいですか?[y/n] =>"     read REPLY   if [[ ${REPLY} != "y" ]] then echo "処理を中止します。" exit ${exit_cancel}        fi esac

  • シェルで親プロセス終了時に子プロセスも終了させるには?

    シェルスクリプトを作っています. 親プロセス(AAA.sh)から子プロセス(BBB.sh)を呼び出した状態で,AAA.shをkillすると,BBB.shのプロセスが終了しないまま,残ってしまうため, http://oshiete1.goo.ne.jp/qa1968135.html を参考にkill -- -$$で同じプロセスグループのものが終了するように作ったのですが,BBB.shが呼び出される前にAAA.shをkillすると,プログラムが暴走してしまいます. どうすれば暴走せずに,親子ともども終了させることができるでしょうか??? *** AAA.sh *** #!/bin/sh func exit_AAA(){ kill -- -$$ exit 1 } trap "exit_AAA" HUP INT QUIT TERM echo "call BBB??(y/n)" read num ./BBB.sh *** BBB.sh *** #!/bin/sh echo "exit BBB?(y/n)>" read num

  • posixでshellを起動したとき`date`コマンドなどが実行できません

    MS-DOSからposixでshellを起動して`date`を実行した場合、 「date: Command not found.」エラーになります。 Cシェルのウィンドウで実行した場合は、正常に動作します。DOS(posix)で起動した場合は、エラーになっています。なぜエラーになるのか原因がわからず困っています。 エラーとなる原因を教えていただけないでしょうか。 また、SFUで開発する上で参考となるページなどありましたら教えていただければ幸いです。 Shellの内容は以下のとおりです。 <シェル起動ファイルの内容> posix /u /c /bin/tcsh -f HOGE.csh <shell(HOGE.cshファイル)の内容> # echoで日付を表示 echo "`date +%y/%m/%d` `date +%H:%M:%S`" <環境> Windows2003サーバー SFU3.0

  • Kシェルが動作しない。

    Kシェルが動作しない。 以下シェル自体ですが、単体では動作するのですが、メインのシェルから呼び出すと動作しなくなります。 動作しない条件としては、子シェルがメインシェルのwhile文の中に入れていると無限ループ???してしまいます。(for文やそれ以外では動作します。) なにかご存知でしたら、ご教授願います。 ・子シェル(Yes or Noを入力するまで無限ループする) #!/bin/ksh answer= echo "Do you add xxxx ? ---> [y/n]\c" while : do if [ "`echo -n`" = "-n" ]; then echo "$@\c" else echo -n "\@" fi read answer case "${answer}" in [yY] | yes | YES | Yes ) return 0 ;; [nN] | no | NO | No ) return 1 ;; * ) echo "Please enter y or n." ;; esac done ・メインシェル #!/bin/ksh while read line do /xxx/子シェル.ksh done < /xxx/zzz.txt 分かりづらいかも知れませんが、ご容赦願います。

  • Linuxのシェルについて

    いつもお世話になっております。 Linux(redhat)でのシェルスクリプトを作成したいと思いますが、あるコマンドを実行して実行成功したか失敗したかをstatusで拾う形にしたのですがうまくいきません。アドバイスをお願いします。 例: #!/bin/sh set ST = $status date ←コマンド if [ $ST == 0 ]; then echo "**************" echo "* o k *" echo "**************" exit $NORMAL else echo "**************" echo "* N G  *" echo "**************" exit $ABEND fi

  • shellで$入り変数に値を代入する方法

    shellで、変数への代入処理で困っています。 下記サンプルソースのように代入する変数自体にfor文で使用している変数が含められるようにしたいのですが、下記の通りだと実行できません。 うまく意図通りに動かす方法はございませんでしょうか? ---------------------------------------------------------------- #!/bin/sh #変数初期化 n00=0 n01=1 n02=2 n03=3 n04=4 #メインルーチン for i in 00 01 02 03 04 ; do temp=`eval echo '$'"n"${i}` #変数値をtempに格納 n${i}=`expr ${temp}+1` #各変数の値を+1する。 n${i}の部分をどのようにすればよいか不明 done ---------------------------------------------------------------- # 望ましい結果 echo ${n00} -> 1 echo ${n01} -> 2 : ※制約事項 ・ shのみ使用可能で、ksh,csh.bashは使用不可 ・ n[0]=0,n[1]=1・・・というように配列の使用は無し