2012-07-30 159 views
2

我想了解一些腳本,但是我找不到一種功能的解決方案。Bash腳本幫助/評估

基本上我想請求評估我的腳本,因爲它可能可以降低複雜性和行數。

此腳本的目的是從Amazon S3下載隨機加密的MySQL備份,恢復轉儲並運行一些隨機的MySQL查詢。

我不知道如何通過電子郵件發送printf語句的輸出 - 一個用於標題,第二個用於實際數據。我試過,所以它看起來像下面的格式輸出,但我不得不排除從loop標題:

Database: Table:   Entries:      

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

我想在電子郵件中包含該輸出,改變基於該電子郵件主題腳本的成功/失敗。

我可能使用很多if循環,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 
+1

如果你希望有人通常爲您檢查代碼,張貼http://codereview.stackexchange.com:建設 主題行後的文件發送 – kojiro 2012-07-31 12:56:04

回答

1

如果你問的具體問題(而不是「請查看我的代碼」),你會得到最好的答案...如果你限制了每個崗位的一個問題。關於通過電子郵件發送printf語句的輸出:

您可以將語句組合到一個塊中,然後將塊的輸出傳送到另一個程序中。例如:

{ 
    echo "This is a header" 
    echo 

    for x in {1..10}; do 
    echo "This is row $x" 
    done 
} | mail -s "Here is my output" [email protected] 

如果你想在郵件主題須待成功或在腳本中的其他地方的東西 故障,您可以(a)您 輸出保存到一個文件,然後(B)

{ 
    echo "This is a header" 
    echo 

    for x in {1..10}; do 
    echo "This is row $x" 
    done 
} > output 

if is_success; then 
    subject="SUCCESS: Here is your output" 
else 
    subject="FAILURE: Here are your errors" 
fi 

mail -s "$subject" [email protected] < output