我正在尝试获取脚本这里在我的 Ubuntu 服务器上通过 cron 备份 SVN 存储库。
#!/bin/bash
BACKUP_DIR="/backup/repository"
REPOSITORY_DIR="/home/svn/repository"
#search in repository folder to find all the repository names
ls -Al --time-style=long-iso /home/svn/repository/ | grep '^d' | awk '{print $8}' | while read line
do
if [ ! -d $BACKUP_DIR"/"$line ]; then
mkdir $BACKUP_DIR"/"$line
fi
#Getting revision number
REVISION=`cat $REPOSITORY_DIR"/"$line"/db/current" | awk '{print $1}'`
#Archive last backup
tar -czf $BACKUP_DIR"/"$line"-last.tar.gz" $BACKUP_DIR"/"$line"/"
#Dangerous :)
if [ -n "$BACKUP_DIR" ]; then
rm -rf $BACKUP_DIR"/"$line"/*"
fi
#Check to see if exists a hot backup
if [ -d $BACKUP_DIR"/"$line"/"$line"-"$REVISION ]; then
echo "Skipping Backup ! Backup Already Exists"
else
echo "Doing backup for "$line
/usr/bin/svn-hot-backup $REPOSITORY_DIR"/"$line $BACKUP_DIR"/"$line
fi
done
我已将路径更改为正确的路径,并安装了 subversion-tools,但是如果我尝试运行 sudo bash svnbackup.sh,则会出现以下错误:
: command not foundline 2:
svnfullbackup.sh: line31: syntax error near unexpected token 'done'
svnfullbackup.sh: line31: 'done'
我推测这些错误是导致 cron 无法在指定时间内运行的原因。我该如何修复它们?
答案1
“命令未找到”错误看起来像是被覆盖了,这表明行尾类型错误。运行dos2unix
脚本文件来修复这个问题。可能是其他一些杂散字符。使用hexdump
或显示脚本cat -v
来揭示这一点。当您在 Unix 文件上使用 Windows 编辑器时,通常会发生此问题。
而不是这一行:
ls -Al --time-style=long-iso /home/svn/repository/ | grep '^d' | awk '{print $8}' | while read line
用这个:
find "$REPOSITORY_DIR" -maxdepth 1 -type d | while read -r line
which 不依赖于ls
which 不适用于脚本/管道。在文件名包含空格的情况下,这样做也更有可能奏效。
您可以按照自己的方式进行引用,但是这个例子可能更好,因为如果文件名中有空格它也能工作:
if [ ! -d "$BACKUP_DIR/$line" ]; then
mkdir "$BACKUP_DIR/$line"
最好使用$()
反引号,而且cat
没有必要(也简化了引用):
REVISION=$(awk '{print $1}' "$REPOSITORY_DIR/$line/db/current" )
还有更多地方可以简化引用。
答案2
我似乎找不到脚本中的任何错误,只是当存储库名称包含空格时它将不起作用......是这种情况吗?