2012-07-30 101 views
0

我试图学习一些脚本,但是我找不到一种功能的解决方案。Bash脚本帮助/评估

基本上我想请求评估我的脚本,因为它可能可以降低复杂性和行数。

此脚本的目的是从Amazon S3下载随机加密的MySQL备份,恢复转储并运行一些随机的MySQL查询。

我不确定如何通过电子邮件发送printf语句的输出 - 一个是标题,第二个是实际数据。我试过,所以它看起来像下面的格式输出,但我不得不从循环排除标题:

Database: Table:   Entries:      

database1 random_table  0        
database2 random_table  0        
database3 random_table  0 
database4 random_table  0 

我想在电子邮件中包含该输出,改变基于该电子邮件主题脚本的成功/失败。

如果循环和MySQL查询可能会很复杂,我可能会用到很多。

脚本:

#!/usr/bin/env bash 

# DB Details: 
db_user="user" 
db_pass="password" 
db_host="localhost" 

# Date 
date_stamp=$(date +%d%m%Y) 

# Initial Setup 
data_dir="/tmp/backup" 

# Checks 
if [ ! -e /usr/bin/s3cmd ]; then 
    echo "Required package (http://s3tools.org/s3cmd)" 
    exit 2 
fi 
if [ -e /usr/bin/gpg ]; then 

    gpg_key=$(gpg -K | tr -d "{<,>}" | awk '/[email protected]/ { print $4 }') 

    if [ "$gpg_key" != "[email protected]" ]; then 
     echo "No GPG key" 
     exit 2 
    fi 

else 
    echo "No GPG package" 
    exit 2 
fi 

if [ -d $data_dir ]; then 
    rm -rf $data_dir/* && chmod 700 $data_dir 
else 
    mkdir $data_dir && chmod 700 $data_dir 
fi 

# S3 buckets 
bucket_1=s3://test/ 

# Download backup 

for backup in $(s3cmd ls s3://test/ | awk '{ print $2 }') 
do 
    latest=$(s3cmd ls $backup | awk '{ print $2 }' | sed -n '$p') 
    random=$(s3cmd ls $latest | shuf | awk '{ print $4 }' | sed -n '1p') 
    s3cmd get $random $data_dir >/dev/null 2>&1 
done 

# Decrypting Files 
for file in $(ls -A $data_dir) 
do 
    filename=$(echo $file | sed 's/\.e//') 
    gpg --out $data_dir/$filename --decrypt $data_dir/$file >/dev/null 2>&1 && rm -f $data_dir/$file 
    if [ $? -eq 0 ]; then 

     # Decompressing Files 
     bzip2 -d $data_dir/$filename 
     if [ $? -ne 0 ]; then 
      echo "Decompression Failed!" 
     fi 
    else 
     echo "Decryption Failed!" 
     exit 2 
    fi 
done 

# MySQL Restore 

printf "%-40s%-30s%-30s\n\n" Database: Table: Entries: 

for dump in $(ls -A $data_dir) 
do 
    mysql -h $db_host -u $db_user -p$db_pass < $data_dir/$dump 
    if [ $? -eq 0 ]; then 

     # Random DBs query 
     db=$(echo $dump | sed 's/\.sql//') 
     random_table=$(mysql -h $db_host -u $db_user -p$db_pass $db -e "SHOW TABLES" | grep -v 'Tables' | shuf | sed -n '1p') 
     db_entries=$(mysql -h $db_host -u $db_user -p$db_pass $db -e "SELECT * FROM $random_table" | grep -v 'id' | wc -l) 

     printf "%-40s%-30s%-30s\n" $db $random_table $db_entries 

     mysql -h $db_host -u $db_user -p$db_pass -e "DROP DATABASE $db"  
    else 
     echo "The system was unable to restore backups!" 
     rm -rf $data_dir 
     exit 2 
    fi 
done 

#Remove backups 
rm -rf $data_dir 
+0

可能重复的状态http://stackoverflow.com/questions/11740175/bash-script-help-评估) – mgibsonbr 2012-12-01 06:17:41

回答

1

搬离循环:

random_tables=$(mysql -h $db_host -u $db_user -p$db_pass $db -e "SHOW TABLES" | grep -v 'Tables') 
table_nb=$(wc -l <<<"$random_tables") 

,并在环

random_table=$(sed -n $((RANDOM%table_nb+1))p <<<"$random_tables") 

的一句话$?在最新命令的状态执行,从而&& rm后它不会是[bash脚本的帮助/评估(解密的

+0

“random_tables”必须位于$ db变量的循环中。请您详细说明下面的语法,因为我没有完全理解:'$(sed -n $((RANDOM%table_nb + 1))p' - 'RANDOM' - 这是一些sed变量吗?谢谢 – HTF 2012-07-31 09:29:02

+0

不,它是一个bash变量'man bash''/RANDOM' – 2012-07-31 09:36:14