为什么我的备份脚本无法构建 tar.gz 文件并通过 scp 发送它?

为什么我的备份脚本无法构建 tar.gz 文件并通过 scp 发送它?

我正在尝试创建一个脚本来自动执行 MySQL 备份并将生成的文件传输到另一台服务器。

我设法创建了转储文件,但从那时起还没有取得太大进展。到目前为止的脚本粘贴如下。

#!/bin/bash

# database credentials
DATABASEHOST="<url>"
DATABASEUSER="<user>"
DATABASEPASSWORD="<password>"
DATABASESCHEMA="<schema>"
DATABASEENV="<env>"

# Local directory of mysqldump file
LOCALDIR=/home/<user>/db-bkp

# Temporary directory for compressed file
TEMPDIR=/home/<user>/tmp

# Remote Directory for backups.
REMOTEDIR=/home/<user>/db-bkp

# Backup host to login to
BACKUPHOST=<backup-host>
#--- end config


echo $(date +%H:%M)
echo "Creating the MySQL dump" 
mysqldump --host="$DATABASEHOST" --user="$DATABASEUSER" --password="$DATABASEPASSWORD" --single-transaction "$DATABASESCHEMA" > "$LOCALDIR"/"$(date +%Y%m%d)_bkp_$DATABASESCHEMA.sql"

#echo "Generating md5sum"
md5sum "$LOCALDIR"/* > "$LOCALDIR"/checklist.chk

#echo "Compressing the dump and checklist"
tar -cvzf "$TEMPDIR"/"$(date +%Y%m%d"_"$DATABASEENV"_"$DATABASESCHEMA".tar.gz "$LOCALDIR"/*

#echo "Sending the compressed file to d2"
scp "$TEMPDIR"/"$DATABASESCHEMA".tar.gz "$BACKUPHOST":"$REMOTEDIR"

#echo "Removing generated files"
#rm "$LOCALDIR"/checklist.chk > /dev/null 2>&1

#rm "$LOCALDIR"/"$(date +%Y%m%d)_bkp_$DATABASESCHEMA.sql" > /dev/null 2>&1

#rm "$TEMPDIR"/"$DATABASESCHEMA".tar.gz > /dev/null 2>&1

echo $(date +%H:%M)

由于我仍在测试它,因此我进行了大量手动运行,但在最后几次执行中,它设法创建了转储文件和 md5sum 哈希,但在那里停止了。

<user>@<host>:~/db-bkp$ ./dev_backup.sh 
10:45
Creating the MySQL dump
./dev_backup.sh: line 48: unexpected EOF while looking for matching `"'
./dev_backup.sh: line 51: syntax error: unexpected end of file

有趣的是第 48 行和第 51 行被注释掉了。这里发生了什么?

答案1

对于上面的代码,运行“bash -n”会给出以下输出:

line 42: unexpected EOF while looking for matching `"'
line 45: syntax error: unexpected end of file

因此,将 tarball 创建命令更改为以下内容:

tar -cvzf "$TEMPDIR"/$(date +%Y%m%d)"_"$DATABASEENV"_"$DATABASESCHEMA".tar.gz" "$LOCALDIR"/*

我想这应该可行。

答案2

您可以通过最小化所使用的引号数量来做到这一点:

tar -cvzf \
    "$TEMPDIR/$(date '+%Y%m%d')_$DATABASEENV\_$DATABASESCHEMA.tar.gz" \
    "$LOCALDIR"/* \
;

请注意,您错过了该命令的右括号,$(date..由于引号的密度,该命令不容易被发现。

答案3

这更漂亮

tar czvf ${TEMPDIR}/$(date +%Y%m%d)_${DATABASEENV}_${DATABASESCHEMA}.tar.gz ${LOCALDIR}/*

相关内容