シェルスクリプト(bash)でデータベース、テーブルをバックアップ、削除、作成、データインポート

シェルスクリプト(bash)でデータベース、テーブルをバックアップ、削除、作成、データインポートする際に使った処理の備忘録です。

# データベース操作系

## データベース参照できない場合
```sh
echo "SHOW DATABASES" | mysql $DB_USER $DB_PASS -D $DB_NAME -h $DB_HOST
if [ $? -gt 0 ]; then
    echo "[ERROR]データベース参照不可。シェルスクリプトを強制終了する。";
    exit 1;
fi
# $DB_USER：-uroot等
# $DB_PASS：-proot等
# $DB_NAME：test_db等
# $DB_HOST：localhost等
```

## 条件に合うレコードの件数を取得
```sh
CNT_REC=(`echo "SELECT COUNT(*) FROM test_table WHERE test_cd==\"$TEST_CD\"" | mysql $DB_USER $DB_PASS -D $DB_NAME -h $DB_HOST`);
if [ $? -gt 0 ]; then
    echo "[ERROR]test_table参照失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi
if [ ${CNT_REC[1]} -eq 0 ]; then
    echo "[ERROR]test_tableにデータなし。シェルスクリプトを強制終了する。";
    exit 1;
fi
```

## データベースのバックアップを取得
```sh
DATE=`date "+%Y%m%d%H%M%S"`;
mysqldump --add-locks --disable-keys --extended-insert --lock-all-tables --quick --quote-names $DB_USER $DB_PASS -h $DB_HOST -B $DB_NAME > $BACKUP_BASE_DIR$DB_NAME"_"$DATE".dump"
if [ $? -gt 0 ]; then
    echo "[ERROR]バックアップ失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi
```

## データベース削除
```sh
echo "DROP DATABASE IF EXISTS "$DB_NAME | mysql $DB_USER $DB_PASS -h $DB_HOST
if [ $? -gt 0 ]; then
    echo "[ERROR]データベース削除失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi
```

## データベース作成
```sh
echo "CREATE DATABASE IF NOT EXISTS "$DB_NAME | mysql $DB_USER $DB_PASS -h $DB_HOST
if [ $? -gt 0 ]; then
    echo "[ERROR]データベース作成失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi
```

## SQLファイルをインポートする。
```sh
cat $IMPORT_FILE | mysql $DB_USER $DB_PASS -h $DB_HOST -D $DB_NAME
if [ $? -gt 0 ]; then
    echo "[ERROR]インポート失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi
```

## viewテンプレートファイルをインポートする。
```sh
mysql  $DB_USER $DB_PASS -h $DB_HOST -D $DB_NAME < $IMPORT_VIEW_FILE
if [ $? -gt 0 ]; then
    echo "[ERROR]viewテンプレートファイルのインポート失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi
```

# ファイル操作系

## パーミッションを変更する
```sh
chmod 777 $TEST
if [ $? -gt 0 ]; then
    echo "[ERROR]パーミッション変更失敗。シェルスクリプトを強制終了する。";
    exit 1;
fi
```

## 世代管理(※バックアップファイルが3つ以上ある場合は古いものを削除する)
```sh
DATE_YEAR=`date "+%Y"`;
while :
do
    BACKUP_CNT=`ls -1r $BACKUP_BASE_DIR$DB_NAME"_"$DATE_YEAR*".dump" | wc -l`;
    if [ $BACKUP_CNT -le $BACKUP_MAX ]; then
        break;
    fi

    rm `ls -1r $BACKUP_BASE_DIR$DB_NAME"_"$DATE_YEAR*".dump" | tail -1`;
    if [ $? -gt 0 ]; then
        echo "[ERROR]旧バックアップファイル削除失敗。シェルスクリプトを強制終了する。";
        exit 1;
    fi
done
```

# 時刻制御系

## 現在時刻取得
```sh
DATE_NOW=`date "+%Y/%m/%d %H:%M:%S"`;
```

## 1ヵ月前の年月日を取得
```sh
DATE_1MAGO=`date -d "1 month ago" "+%Y-%m-%d"`;
```

## 平日かどうか判定
```sh
if [ `date -d $DATE_TARGET "+%u"` -lt 6 ]; then
    # 平日
else
    # 休日
fi
```

# その他

## シェルスクリプト実行時に付けたパラメータ数(=引数)が1つでない場合。
```sh
if [ $# -ne 1 ]; then
    echo "[ERROR]パラメータ数不正。シェルスクリプトを強制終了する。";
    exit 1;
fi
```

## ファイルが存在しない場合。
```sh
if [ ! -e $FILE_PATH ]; then
    echo "[ERROR]ファイルが存在しない場合。シェルスクリプトを強制終了する。";
    exit 1;
fi
```

## ディレクトリが存在しない場合。
```sh
if [ ! -d $FILE_PATH ]; then
    echo "[ERROR]ディレクトリが存在しない場合。シェルスクリプトを強制終了する。";
    exit 1;
fi
```

## シェルスクリプト内で別のシェルスクリプトを実行する場合。
```sh
source $SHELL_PATH
```

## 数値演算
```sh
TEST2=`expr $TEST1 + 1`;
TEST3=`expr $RANDOM % 500 + 51`;
TEST4=`expr $TEST3 \* \( $RANDOM % 2 + 1 \)`;
```

## (指定した書式での)文字列生成
```sh
TEST2=`printf "%06d" $TEST1`;
```

## case文(CやPHPでいうところのswitch文)
```sh
case $MODE in
    0 )
        echo -e $MODE0;;
    1 )
        echo -e $MODE1;;
    2 )
        echo -e $MODE2;;
    * )
        echo "[ERROR]モード不正。シェルスクリプトを強制終了する。";
        exit 1;;
esac
```

## 特定のファイルの文字列一括置換
```sh
sed -i "s!"$BEFORE"!"$AFTER"!g" $TARGET_FILE
# あるあるミス：「-」を使う場合はエスケープして「\-」とすること。
```

## 特定のディレクトリにあるファイル群を一括で文字列置換
```sh
find $DIR -type f | xargs sed -i -e "s!"$BEFORE"!"$AFTER"!g"
# あるあるミス：「-」を使う場合はエスケープして「\-」とすること。
```

## 特定のディレクトリにあるディレクトリ群を一括で処理
```sh
RESULT_WORK=0;
DIRS=`find $DIR"/test/"* -type d`;
for DIR in $DIRS;
do
    # 何かしらの処理
    if [ $? -gt 0 ]; then
        RESULT_WORK=2;
    fi
done
if [ $RESULT_WORK -eq 0 ]; then
    echo "正常";
else
    echo "失敗";
fi
```

## どちらか一方でも空である場合
```sh
if [ -z $ADMIN_ID -o -z $ADMIN_PASS ]; then
    echo "[ERROR]どちらか一方でも空である場合。シェルスクリプトを強制終了する。";
    exit 1;
fi
```

## ランダムパスワード作成、htpasswd作成
```sh
FRONT_ID="test";
FRONT_PASS=`cat /dev/urandom | tr -dc "[:alnum:]" | fold -w 16 | grep -v "[gqoO09bhIl]" | head -1`;
rm -rf $AUTH_DIR$FRONT_TOP"/.htpasswd";
htpasswd -n -b $FRONT_ID $FRONT_PASS > $AUTH_DIR$FRONT_TOP"/.htpasswd"
chmod 777 $AUTH_DIR$FRONT_TOP"/.htpasswd";
echo $FRONT_ID"："$FRONT_PASS > "front_auth.txt"
chmod 777 "front_auth.txt"

# front_auth.txtからIDとPASSを取得する方法の一例
array=(`cat "front_auth.txt" | tr -s "：" "\n"`);
FRONT_ID=`echo ${array[0]}`;
FRONT_PASS=`echo ${array[1]}`;
```