Bash
為什麼我的備份腳本無法建構 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 行被註釋掉了。這裡發生了什麼?
對於上面的程式碼,執行“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..
由於引號的密度,該命令不容易被發現。