- PR -

if文でのワイルドカードの使用方法について

1
投稿者投稿内容
SDN
会議室デビュー日: 2005/06/28
投稿数: 13
投稿日時: 2005-10-03 16:09
いつも御世話になっております。

kshで、if文の条件式にワイルドカードを使いたいのですが、
文字列として扱われてしまいます。
例えば
if [ 文字列 = ABC* ]
then
  ・・・
という条件を設けたいのですが、
"ABC*"という文字列で判定してしまい、アスタリスクが
ワイルドカードの役割を果たしてくれません。

どうかご教授くださいますようよろしくお願いいたします。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-10-03 17:22
こんにちは。
引用:
if [ 文字列 = ABC* ]
then
  ・・・
という条件を設けたいのですが、
"ABC*"という文字列で判定してしまい、アスタリスクが
ワイルドカードの役割を果たしてくれません。


これは「文字列」が“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”を使用する。

以上、ご参考まで。
SDN
会議室デビュー日: 2005/06/28
投稿数: 13
投稿日時: 2005-10-03 17:43
To angelさん

早々のご回答ありがとうございます。
また、詳細なレクチャーありがとうございます。

if文はやはり単純な文字列比較しかできませんか。。。
御教示いただいた方法で検討してみます。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-10-03 17:57
引用:
if文はやはり単純な文字列比較しかできませんか。。。


えーと、どちらかというと、[ ( test ) コマンドの限界と言うべきでしょうか。
if コマンドは、条件判定部分の結果を元に分岐するだけですから。
なので、最悪 grep を条件判定に使えば、それだけでもかなり強力になるわけです。

補足
 前述の正規表現は、“^ABC.*”でなくとも“^ABC”で十分でしたね。

雑感
  if grep 〜
  then
   …
 という処理を、
  grep 〜
  if [ $? = 0 ]
  then
   …
 としているような記述を良く見るのですが、何か冗長で、私は好みでは無いです。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-10-07 19:51
補足です。
以下のページを、ひょんなことから見つけました。AIX の ksh のドキュメントです。
 ・Korn シェル (POSIX シェル) コマンド
 ・Korn シェル (POSIX シェル) におけるパラメーター置換
SDN
会議室デビュー日: 2005/06/28
投稿数: 13
投稿日時: 2005-10-13 16:22
angelさま

御返事が遅れ申し訳ありません。
kshのドキュメント、とても便利ですね。
これ程詳細に書かれているものとは知りませんでした。
これから活用させていただきます。

ご親切にありがとうございました。
また機会がありましたらよろしくお願いいたします。
今度は微力ながら私が御協力できればと思います。
1

スキルアップ/キャリアアップ(JOB@IT)