- PR -

シェルによる後ろ2桁の判定

1
投稿者投稿内容
シュワンツ
ベテラン
会議室デビュー日: 2002/08/27
投稿数: 56
投稿日時: 2005-05-23 16:17
基礎的な質問です。
現在シェルを作成していますが、if文の書き方がわからないので何方か、ヒントをお願いします。

【やりたい事】
年月の後ろ2桁が'03' or '09'なら処理を分岐させる
※正規表現をすれば良いと思ったが、うまく行かない。
 

【シェル例】
ym='200503'

if [ $ym= ???? ];then  ←このif文の書き方がわからない
echo '決算処理'
else
echo '何もしない'
fi

※参考になるURLや本があれば紹介してください
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-05-23 16:42
こんにちは。
引用:
【やりたい事】
年月の後ろ2桁が'03' or '09'なら処理を分岐させる
※正規表現をすれば良いと思ったが、うまく行かない。


シェルスクリプトは、何せどんなコマンドを使ってもO.K.ですから、方法は一つに限定されません。
とりあえず思いつく限りだと…

1. 正規表現を使う
 grep を if文の判定に組み込む。if echo "$ym" | grep -q 正規表現; then …

2. case文 + glob (所謂パターンマッチ)
 case 文は、条件分岐に glob が使えますので、次のようにして分岐処理ができます。
case "$ym" in ????03) 〜 ;; esac → 200503等の場合には処理が実行される

3. パラメータ展開
 ${変数} にも色々バリエーションがありますが、% + glob が良いでしょうか。
もし、ym が 200503 であれば、${ym%03} は 2005 ですし、${ym%????03} は空文字列になります。これを利用して条件判断をすれば…。

引用:
※参考になるURLや本があれば紹介してください


とりあえず、bash(1)を見るのも十分勉強になると思います。
※移植性を考えるなら、bash限定の機能には注意

以上、ご参考まで。

追記:
そうそう。判定の正確さをどこまで求めるか(文字数チェックのみで良いか、非数字が使われていないかをチェックするか…等) によっても、スクリプトの内容が変わってきますので、その辺にも注意ですね。

[ メッセージ編集済み 編集者: angel 編集日時 2005-05-23 16:48 ]
コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2005-05-23 17:03
コード:
#!/bin/sh
ym='200503'
zm=`echo $ym | sed 's/^[0-9][0-9][0-9][0-9]//'`

if [ "$zm" = "03" -o "$zm" = "09" ]; then
    echo '決算処理'
else
    echo '何もしない'
fi



モキュッ!!
シュワンツ
ベテラン
会議室デビュー日: 2002/08/27
投稿数: 56
投稿日時: 2005-05-23 17:14
ありがとうございました。
動作しました。
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-05-23 17:15
も一つ参考資料。glob(7)
glob によるパターンマッチについて、です。
※ そう言えばワイルドカードという呼び方もありましたね
あんとれ
ぬし
会議室デビュー日: 2004/01/14
投稿数: 556
投稿日時: 2005-05-24 09:22
こんな書き方はダメですか?
正規表現を使うよりもシンプルのような気がしますが・・・

case $ym in
*03)
*09)
echo "決算処理"
;;
*)
;;
esac


[ メッセージ編集済み 編集者: あんとれ 編集日時 2005-05-24 09:23 ]
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2005-05-24 09:44
ちょん切ってみるとか。
mm=`echo $ym | colrm 1 4`
とか
mm=`echo $ym | cut -b 5,6`
とか。美しくはないけれど、やってることは明快。

[ メッセージ編集済み 編集者: ぽんす 編集日時 2005-05-24 09:45 ]
1

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