- - PR -
if文でのワイルドカードの使用方法について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-10-03 16:09
いつも御世話になっております。
kshで、if文の条件式にワイルドカードを使いたいのですが、 文字列として扱われてしまいます。 例えば if [ 文字列 = ABC* ] then ・・・ という条件を設けたいのですが、 "ABC*"という文字列で判定してしまい、アスタリスクが ワイルドカードの役割を果たしてくれません。 どうかご教授くださいますようよろしくお願いいたします。 | ||||
|
投稿日時: 2005-10-03 17:22
こんにちは。
これは「文字列」が“ABC*”というパターンにマッチする、という条件でよろしいでしょうか。 単に ABC* と書くと、現在のディレクトリ上にある「ABCで名前が始まるファイル・ディレクトリの名前」に置き換わった上で、処理が行われてしまいますので。 そうした場合…、確かに [, test コマンドでは文字列の単純比較しかできませんが、幾つか方法が考えられます。 1. case を使う case の各条件には、そのままワイルドカード付きパターンが使えます。 case "$string" in ABC*) echo match ;; *) echo unmatch esac 2. parameter展開を使う パラメータ展開(bash)は、kshでもある程度使えるはず。 これで文字列を操作して、条件判断に応用すれば良さそうです。 例: string=ABCDEF → ${string#ABC} = DEF という展開を利用 if [ "$string" != "${string#ABC}" ] then echo match else echo unmatch fi 3. パターンマッチを外注する シェルのワイルドカードに拘らず、grep の正規表現によるパターンマッチを利用する if grep -q '^ABC.*' <<_EOS_ $string _EOS_ then echo match else echo unmatch fi もしくは if echo "$string" | grep -q '^ABC.*' then …(後略)… ※ 環境により grep の -q ( quiet ) オプションが使用できない場合は、 “grep -q パターン”の替わりに“grep パターン >/dev/null”を使用する。 以上、ご参考まで。 | ||||
|
投稿日時: 2005-10-03 17:43
To angelさん
早々のご回答ありがとうございます。 また、詳細なレクチャーありがとうございます。 if文はやはり単純な文字列比較しかできませんか。。。 御教示いただいた方法で検討してみます。 | ||||
|
投稿日時: 2005-10-03 17:57
えーと、どちらかというと、[ ( test ) コマンドの限界と言うべきでしょうか。 if コマンドは、条件判定部分の結果を元に分岐するだけですから。 なので、最悪 grep を条件判定に使えば、それだけでもかなり強力になるわけです。 補足 前述の正規表現は、“^ABC.*”でなくとも“^ABC”で十分でしたね。 雑感 if grep 〜 then … という処理を、 grep 〜 if [ $? = 0 ] then … としているような記述を良く見るのですが、何か冗長で、私は好みでは無いです。 | ||||
|
投稿日時: 2005-10-07 19:51
補足です。
以下のページを、ひょんなことから見つけました。AIX の ksh のドキュメントです。 ・Korn シェル (POSIX シェル) コマンド ・Korn シェル (POSIX シェル) におけるパラメーター置換 | ||||
|
投稿日時: 2005-10-13 16:22
angelさま
御返事が遅れ申し訳ありません。 kshのドキュメント、とても便利ですね。 これ程詳細に書かれているものとは知りませんでした。 これから活用させていただきます。 ご親切にありがとうございました。 また機会がありましたらよろしくお願いいたします。 今度は微力ながら私が御協力できればと思います。 |
1