Bash脚本帮助/评估

时间:2012-07-30 14:29:37

标签: 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 '/an@example.com/ { print $4 }')

if [ "$gpg_key" != "an@example.com" ]; 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 个答案:

答案 0 :(得分: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" lars@example.com

如果您想使电子邮件主题取决于成功或 脚本中其他地方的失败,你可以(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" lars@example.com < output
相关问题