繁体   English   中英

linux bash语法错误:文件意外结束

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM