【Shell】 シェルで部分一致(前方一致・後方一致)

■ はじめに

小ネタ。

前方一致をやりたくて調べたら、
意外と grep を使ったりとかが多かった。

ただ、もっとシンプルにできる方法があったので、メモ。

目次

【1】部分一致(前方一致・後方一致)
【2】サンプル
 例1:前方一致
 例2:後方一致
 例3:部分一致
【3】おまけ:共通化(関数化)

【1】部分一致(前方一致・後方一致)

* 「case文」と 「ワイルドカード(*)」で簡単に実装できる
 => サンプルを見たほうが理解が早いと思う。

【2】サンプル

例1:前方一致

#!/bin/bash

# 対象文字列
env="prod-v2"

case "${env}" in
  prod*)
    env_type=1
    ;;
  stage* | nonprod*)
    env_type=2
    ;;
  *)
    env_type=0
    ;;
esac

echo "Env Type = ${env_type}"

出力結果

Env Type = 1

例2:後方一致

#!/bin/bash

# 対象文字列
file_name="hello_world.jpg"

# 後方一致
case "${file_name}" in
  *.txt)
    file_type=1
    ;;
  *.jpg|*.jpeg)
    file_type=2
    ;;
  *.mp3)
    file_type=3
    ;;
  *)
    file_type=0
    ;;
esac

echo "File type = ${file_type}"

出力結果

File type = 2

例3:部分一致

#!/bin/bash

TARGET_FILE=${1}

is_insert=0
case "${TARGET_FILE}" in
  *_insert_table_*.sql)
    is_insert=1
    ;;
  *)
    is_insert=0
    ;;
esac

echo "is_insert = ${is_insert}"

出力例

$ ./sample.sh
is_insert = 0

$ ./sample.sh 01_insert_table_xxx.sql
is_insert = 1

$ ./sample.sh 01_insert_table_xxx.hql
is_insert = 0

$ ./sample.sh 01_inser_table_xxx.sql
is_insert = 0

$ ./sample.sh 02_insert_table_yyyy.sql
is_insert = 1

$ ./sample.sh 02_insert_tableyyyy.sql
is_insert = 0

$ ./sample.sh _insert_table_.sql
is_insert = 1

【3】おまけ:共通化(関数化)

#!/bin/bash

PROD_TYPE_VALUE=1
STAGE_TYPE_VALUE=2
OTHER_TYPE_VALUE=0

get_env_type() {
  case "$1" in
    prod*)
      env_type=${PROD_TYPE_VALUE}
      ;;
    stage* | nonprod*)
      env_type=${STAGE_TYPE_VALUE}
      ;;
    *)
      env_type=${OTHER_TYPE_VALUE}
      ;;
  esac
  echo "${env_type}"
}

is_prod() {
  env_type=`get_env_type $1`
  if [ ${env_type} = ${PROD_TYPE_VALUE} ]; then
    echo 1
  else
    echo 0
  fi
}

is_stage() {
  env_type=`get_env_type $1`
  if [ ${env_type} = ${STAGE_TYPE_VALUE} ]; then
    echo 1
  else
    echo 0
  fi
}

# 対象文字列
env="prod-v2"

prod=`is_prod ${env}`
echo "Prod = ${prod}"

stage=`is_stage ${env}`
echo "Stage = ${stage}"

出力結果

Prod = 1
Stage = 0

参考文献

https://mag.osdn.jp/09/01/06/0127210

関連記事

条件分岐 ~ if / case ~
https://dk521123.hatenablog.com/entry/2015/05/01/000043
シェル ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2014/10/23/005406
シェル ~ 基本構文編 ~
https://dk521123.hatenablog.com/entry/2015/02/20/001600
関数
https://dk521123.hatenablog.com/entry/2015/03/17/233124