Bash

為什麼我的備份腳本無法建構 tar.gz 文件並通過 scp 發送?

  • February 21, 2017

我正在嘗試創建一個腳本來自動化 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 行被註釋掉了。這裡發生了什麼?

對於上面的程式碼,執行“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"/*

我想這應該可行。

您可以通過最小化使用的引號數量來做到這一點:

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

請注意,您缺少關閉命令的括號,$(date..由於引號的密度,該命令不容易被發現。

引用自:https://unix.stackexchange.com/questions/346282