LoginSignup
67
74

More than 5 years have passed since last update.

シェルスクリプト オプション解析テンプレート

Last updated at Posted at 2015-10-06

オプション解析用テンプレート

 いつもオプション解析の時に調べたりすると忘れるので、テンプレート
 オプションを指定した場合で引数がないといけない場合、なくてもよい場合など。好きに改造して使ってください。

getop.sh
#!/bin/bash


PROGNAME=$(basename $0)
VERSION="1.0"
HELP_MSG="'$PROGNAME -h'と指定することでヘルプを見ることができます"

# ヘルプメッセージ
usage() {
  echo "Usage: $PROGNAME -a arg [-b arg] param"
  echo 
  echo "オプション:"
  echo "  -h, --help"
  echo "      --version"
  echo "  -a, --long-a <ARG>     <必須>"
  echo "  -b, --long-b <string>  [任意] *オプション指定時は引数を設定"
  echo "  -c, --long-c           オプション指定のみ"
  echo
  exit 1
}

# オプション解析
for OPT in "$@"
do
  case "$OPT" in
    # ヘルプメッセージ
    '-h'|'--help' )
      usage
      exit 1
      ;;
    # バージョンメッセージ
    '--version' )
      echo $VERSION
      exit 1
      ;;
    # オプション-a、--long-a
    '-a'|'--long-a' )
      FLG_A=1
      # オプションに引数がなかった場合(必須)
      if [[ -z "$2" ]] || [[ "$2" =~ ^-+ ]]; then
        echo "$PROGNAME:「$1」オプションには引数が必要です" 1>&2
        exit 1
      fi
      ARG_A="$2"
      shift 2
      ;;
    # オプション-b、--long-b
    '-b'|'--long-b' )
      FLG_B=1
      # オプションに引数がなかった場合
      if [[ -z "$2" ]] || [[ "$2" =~ ^-+ ]]; then
        echo ARG_B 1
        shift
      else
        echo ARG_B 2
        # オプションの引数設定
        ARG_B="$2"
        shift 2
      fi
      ;;
    # オプション-c
    '-c'|'--long-c' )
      # オプション指定のみなのでフラグだけ設定(引数がないタイプ)
      FLG_C=1
      shift 1
      ;;
    '--'|'-' )
      # 「-」か「--」だけ打った時
      shift 1
      param+=( "$@" )
      break
      ;;
    -*)
      echo "$PROGNAME: 「$(echo $1 | sed 's/^-*//')」オプションは存在しません。'$PROGNAME -h'で確認してください" 1>&2
      exit 1
      ;;
    *)
      # コマンド引数(オプション以外のパラメータ)
      if [[ ! -z "$1" ]] && [[ ! "$1" =~ ^-+ ]]; then
        param+=( "$1" )
        shift 1
      fi
      ;;
  esac
done

# 「-a」のオプション指定がない場 
if [ -z $FLG_A ]; then
  echo "$PROGNAME:「-a」オプションは必須です。正しいオプションを指定してください" 1>&2
  echo $HELP_MSG 1>&2
  exit 1
fi

# パラメータがない場合
if [ -z $param ]; then
  echo "$PROGNAME:コマンド 引数がありません。正しい引数を指定してください" 1>&2
  echo $HELP_MSG 1>&2
  exit 1
fi


# --共通関数定義--
################
# ログ出力関数 #
################
LOG()
{
  # ログファイル
  LOG_DATE=`date '+%Y-%m-%d'`
  LOG_TIME=`date '+%H:%M:%S'`
  LOGFILE="${LOG_DATE}_test.log"

  # 引数展開
  FILENM=`basename $0`
  TITLE=$1
  MSG=$2

  # ログ出力実行
  printf "%-10s %-8s %-14s %-50s\n" \
  "${TITLE} ${LOG_DATE}" "${LOG_TIME}" "${FILENM}" "${MSG}" >>${LOGFILE}
}

ログは
LOG [INFO] 処理を開始します
のようにすると出力される

67
74
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
67
74