#!/bin/bash ######################################################################## ## Script : bash-utils.sh ## Name : bash 用ユーティリティ関数スクリプト ## Version : 0.0.1 ## Copyright : 2018-2019 Nomura Kei ## License : BSD-2-Clause ######################################################################## SCRIPT_FILE=${0} ######################################################################## ## ## 関数定義 ## # ===================================================================== # 指定されたパスの絶対パスを取得します。 # # [注意事項] # 間にパスが存在しない場合、元の値をそのまま返します。 # # @param $1 パス # @stdout 絶対パス # ===================================================================== function getAbsolutePath() { BASE="" DIR="$1" if [ ! -d ${DIR} ]; then BASE="/$(basename "${DIR}")" DIR=$(dirname "${DIR}") fi if [ ! -d ${DIR} ]; then echo "${DIR}${BASE}" return 1 fi DIR=$(cd "$DIR" && pwd) echo "${DIR}${BASE}" return 0 } # 途中でカレントディレクトリが変更されても良いように。 # SCRIPT_FILE を絶対パスに変換しておく。 SCRIPT_FILE=`getAbsolutePath ${SCRIPT_FILE}` # ===================================================================== # スクリプト中の "## [key] : [value]" 形式で記載されている # プロパティの値([value])を取得します。 # # @param $1 key # @stdout value # ===================================================================== function getProperty() { KEY=${1} sed -n "s/^##\s*${KEY}\s*\:\s*\(.*\)$/\1/p" ${SCRIPT_FILE} } # ===================================================================== # スクリプトファイルのバージョン情報を出力します。 # スクリプトファイルには、次のコメント行が必要となります。 # ※間の空白は無視されます。 # # ## Script : スクリプトファイル名 # ## Version : バージョン番号 # # @stdout バージョン情報 # ===================================================================== function version() { SCRIPT=`getProperty "Script"` VERSION=`getProperty "Version"` echo "${SCRIPT} ${VERSION}" } # ===================================================================== # スクリプトファイルの使用法を出力します。 # スクリプトファイルには、次の形式の使用法情報が必要となります。 # ※'## Usage:' ~ '##' 範囲の行で、'## |'より後ろの文字列が、 # 使用法として表示されます。 # # ## Usage: # ## |使用例) ... # ## |...(ヘルプ情報)... # ## |...(ヘルプ情報)... # ## # # @stdout ヘルプ # ===================================================================== function usage() { sed -n "/^##\s*Usage\s*\:\s*/,/^##\s*$/ s/^##\s*|\(.*\)$/\1/p" ${SCRIPT_FILE} } # ===================================================================== # 指定されたメッセージと共に y/n を入力させ、結果を返します。 # y,Y,n,N いずれの文字でも始まらない場合、デフォルト値を返します。 # # 変数 ${NO_CONFIRM} が 'y' に設定されている場合、 # 問い合わせのメッセージを表示することなく、常に 1 を返します。 # # @param $1 メッセージ # @param $2 デフォルト値 (1=y, 0=n) # @return $? 1/0 (y/n) # ===================================================================== function confirm() { MESSAGE=$1 DEFAULT=$2 if [ "${NO_CONFIRM}" = "y" ]; then return 1 fi LINE= read -p "${MESSAGE} [y/n] " LINE VAL=${LINE:0:1} if [ "${VAL}" = "y" ] || [ "${VAL}" = "Y" ]; then return 1 elif [ "${VAL}" = "n" ] || [ "${VAL}" = "N" ]; then return 0 fi return ${DEFAULT} } # ===================================================================== # 指定された値が、指定されたリストに含まれるか否かを返します。 # # @param $1 リスト。 # @param $2 含まれるか否か検査する値 # @return $? 1/0 (含まれる/含まれない) # ===================================================================== function isContains() { LIST=$1 VALUE=$2 for item in ${LIST}; do if [ "${VALUE}" = "${item}" ]; then return 1 fi done return 0 } # ===================================================================== # 指定された値が、指定されたリスト(正規表現)に # 含まれるか否かを返します。 # # @param $1 リスト。 # @param $2 含まれるか否か検査する値 # @return $? 1/0 (含まれる/含まれない) # ===================================================================== function isContainsRegex() { LIST=$1 VALUE=$2 for item in ${LIST}; do RES=`echo "${item}" | sed "s/${VALUE}/1/"` if [ "${RES}" = "1" ]; then return 1 fi done return 0 } # ===================================================================== # 指定された出力先にファイルがある場合、上書きするかを問い合わせ、 # y が選択された場合、上書きします。 # n が選択された場合、処理を中断します。 # # @param $1 出力先 # ===================================================================== function overwrite() { OUT=$1 if [ -f ${OUT} ]; then MSG_PATH=`getAbsolutePath ${OUT}` confirm "${MSG_PATH} が存在します。上書きしますか?" 0 if [ $? -eq 0 ]; then exit 1 fi fi } # ===================================================================== # パスワードを入力させます。 # 確認のため2回パスワード入力を求め、2回のパスワードが # 一致すれば入力されたパスワードを標準出力し、0 を返します。 # 不一致の場合は、1 を返します。 # # @param $1 パスワード入力メッセージ # @param $2 パスワード再入力メッセージ # @stdout 入力されたパスワード # @return 0/1 (成功/失敗) # ===================================================================== CONFIRM_PASSWORD= function confirmPassword() { MESSAGE=$1 MESSAGE_RE=$2 read -s -p "${MESSAGE}" PASSWORD echo "" read -s -p "${MESSAGE_RE}" CONFIRM_PASSWORD echo "" RET=1 if [ "${PASSWORD}" = "${CONFIRM_PASSWORD}" ]; then CONFIRM_PASSWORD=${PASSWORD} RET=0 else CONFIRM_PASSWORD= RET=1 fi return ${RET} } # ===================================================================== # 指定されたテンプレートファイル中の変数を環境変数の値で置換し、 # 標準出力します。 # # @param $1 テンプレートファイル # @stdout 変数が置換されたテンプレートの内容 # @return 0/1 (成功/失敗[テンプレートファイルが無い]) # ===================================================================== function template() { TMPL_FILE=$1 RET=0 if [ -f ${TMPL_FILE} ]; then while read LINE; do echo $(eval echo "${LINE}") done < ${TMPL_FILE} else RET=1 fi return ${RET} } # ===================================================================== # デバッグ用ステップ実行 # ${DEBUG} の値が 1 の場合、ポーズします。 # ===================================================================== function debugPause() { if [ "${DEBUG}" = "1" ]; then read -p "Please [Enter] > " DUMMY_READ fi }