シェルスクリプト(bash)でデータベース、テーブルをバックアップ、削除、作成、データインポートする際に使った処理の備忘録です。
データベース操作系
データベース参照できない場合
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等
条件に合うレコードの件数を取得
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
データベースのバックアップを取得
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
データベース削除
echo "DROP DATABASE IF EXISTS "$DB_NAME | mysql $DB_USER $DB_PASS -h $DB_HOST
if [ $? -gt 0 ]; then
echo "[ERROR]データベース削除失敗。シェルスクリプトを強制終了する。";
exit 1;
fi
データベース作成
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ファイルをインポートする。
cat $IMPORT_FILE | mysql $DB_USER $DB_PASS -h $DB_HOST -D $DB_NAME
if [ $? -gt 0 ]; then
echo "[ERROR]インポート失敗。シェルスクリプトを強制終了する。";
exit 1;
fi
viewテンプレートファイルをインポートする。
mysql $DB_USER $DB_PASS -h $DB_HOST -D $DB_NAME < $IMPORT_VIEW_FILE
if [ $? -gt 0 ]; then
echo "[ERROR]viewテンプレートファイルのインポート失敗。シェルスクリプトを強制終了する。";
exit 1;
fi
ファイル操作系
パーミッションを変更する
chmod 777 $TEST
if [ $? -gt 0 ]; then
echo "[ERROR]パーミッション変更失敗。シェルスクリプトを強制終了する。";
exit 1;
fi
世代管理(※バックアップファイルが3つ以上ある場合は古いものを削除する)
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
時刻制御系
現在時刻取得
DATE_NOW=`date "+%Y/%m/%d %H:%M:%S"`;
1ヵ月前の年月日を取得
DATE_1MAGO=`date -d "1 month ago" "+%Y-%m-%d"`;
平日かどうか判定
if [ `date -d $DATE_TARGET "+%u"` -lt 6 ]; then
# 平日
else
# 休日
fi
その他
シェルスクリプト実行時に付けたパラメータ数(=引数)が1つでない場合。
if [ $# -ne 1 ]; then
echo "[ERROR]パラメータ数不正。シェルスクリプトを強制終了する。";
exit 1;
fi
ファイルが存在しない場合。
if [ ! -e $FILE_PATH ]; then
echo "[ERROR]ファイルが存在しない場合。シェルスクリプトを強制終了する。";
exit 1;
fi
ディレクトリが存在しない場合。
if [ ! -d $FILE_PATH ]; then
echo "[ERROR]ディレクトリが存在しない場合。シェルスクリプトを強制終了する。";
exit 1;
fi
シェルスクリプト内で別のシェルスクリプトを実行する場合。
source $SHELL_PATH
数値演算
TEST2=`expr $TEST1 + 1`;
TEST3=`expr $RANDOM % 500 + 51`;
TEST4=`expr $TEST3 \* \( $RANDOM % 2 + 1 \)`;
(指定した書式での)文字列生成
TEST2=`printf "%06d" $TEST1`;
case文(CやPHPでいうところのswitch文)
case $MODE in
0 )
echo -e $MODE0;;
1 )
echo -e $MODE1;;
2 )
echo -e $MODE2;;
* )
echo "[ERROR]モード不正。シェルスクリプトを強制終了する。";
exit 1;;
esac
特定のファイルの文字列一括置換
sed -i "s!"$BEFORE"!"$AFTER"!g" $TARGET_FILE
# あるあるミス:「-」を使う場合はエスケープして「\-」とすること。
特定のディレクトリにあるファイル群を一括で文字列置換
find $DIR -type f | xargs sed -i -e "s!"$BEFORE"!"$AFTER"!g"
# あるあるミス:「-」を使う場合はエスケープして「\-」とすること。
特定のディレクトリにあるディレクトリ群を一括で処理
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
どちらか一方でも空である場合
if [ -z $ADMIN_ID -o -z $ADMIN_PASS ]; then
echo "[ERROR]どちらか一方でも空である場合。シェルスクリプトを強制終了する。";
exit 1;
fi
ランダムパスワード作成、htpasswd作成
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]}`;