[英]linux bash syntax error: unexpected end of file
运行bash脚本时遇到一个奇怪的错误:
:没有这样的文件或目录data0 / backup / daily
remotebackup.sh:第41行:语法错误:文件意外结束
代码如下:
#!/bin/bash
##Notification email address
_EMAIL=bonheurswp@gmail.com
ERRORLOG=/var/log/backuplogs/backup.err`date +%F`
ACTIVITYLOG=/var/log/backuplogs/activity.log`date +%F`
SOURCE=/data0/backup/daily
DBNAME=vihomes_ads
SQLFILE=vihomes_ads.sql
BUCKETNAME=hontoot
FOLDERNAME=ads
DESTINATION=`date +%F`
DEGREE=30
#Clear the logs if the script is executed second time
:> ${ERRORLOG}
:> ${ACTIVITYLOG}
# Backup the source files using tar.
tar -zcf ${SOURCE}/htads.tar.gz /data0/www/htads 1>>${ACTIVITYLOG} 2>>${ERRORLOG}
# Dump database into SQL file
mysqldump --user=user_for_ads --password=sa987@Rt#69 ${DBNAME} > ${SOURCE}/${SQLFILE}1>>${ACTIVITYLOG} 2>>${ERRORLOG}
##Uploading the daily backup to Amazon s3
/usr/bin/s3cmd -r put ${SOURCE} s3://${BUCKETNAME}/${FOLDERNAME}/${DESTINATION}/ 1>>${ACTIVITYLOG} 2>>${ERRORLOG} ret2=$?
##Sent email alert
msg="BACKUP NOTIFICATION ALERT FROM `hostname`"
if [ $ret2 -eq 0 ];then
msg1="Amazon s3 Backup Uploaded Successfully"
else
msg1="Amazon s3 Backup Failed!!\n Check ${ERRORLOG} for more details"
fi
echo -e "$msg1"|mail -s "$msg" ${_EMAIL}
#######################
##Deleting backup's older than DEGREE days
## Delete from both server and amazon
#######################
DELETENAME=$(date --date="${DEGREE} days ago" +%F)
/usr/bin/s3cmd -r --force del s3://${BUCKETNAME}/${FOLDERNAME}/${DELETENAME} 1>>${ACTIVITYLOG} 2>>${ERRORLOG}
主要问题是您的脚本具有DOS / Windows风格的行尾(回车后跟换行)。 bash期望使用unix样式的行尾(仅换行),并将回车解释为命令的一部分,从而导致很多混乱。 赠品是此错误消息:
: No such file or directorydata0/backup/daily
在“:没有这样的文件或目录”的部分被认为落入不存在的文件名后 ,但因为文件名是由命令设定SOURCE=/data0/backup/daily<CR>
时,滑架返回时将它打印的端部消息从头开始。
这也会导致关键字出现问题,例如
if [ $ret2 -eq 0 ];then<CR>
... bash不能将then<CR>
识别为then
关键字,它认为它只是if子句的一部分。 而且它到达文件末尾仍在寻找其then
关键字,并且由于它从未看到过,所以出现了意外的文件末尾错误。
因此,请修复行尾(在您的OS中使用dos2unix
或等效的命令),并停止使用以DOS / Windows格式保存的编辑器。
顺便说一句,我也注意到
/usr/bin/s3cmd -r put ${SOURCE} s3://${BUCKETNAME}/${FOLDERNAME}/${DESTINATION}/ 1>>${ACTIVITYLOG} 2>>${ERRORLOG} ret2=$?
ret2=$?
确实应该是一个单独的命令。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.