Я пытаюсь получить сценарий Вот работаю на моем сервере Ubuntu для резервного копирования репозитория SVN через cron.
#!/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 установлены, однако я получаю следующие ошибки, если пытаюсь запустить sudo bash svnbackup.sh:
: command not foundline 2:
svnfullbackup.sh: line31: syntax error near unexpected token 'done'
svnfullbackup.sh: line31: 'done'
Полагаю, именно из-за этих ошибок cron не работал в отведенное время. Как я могу их исправить?
Кажется, я не могу найти ничего плохого в сценарии, за исключением того, что он не будет работать, если у вас есть имена репозиториев, содержащие пробелы ... так ли это?
Ошибка «команда не найдена» выглядит так, как будто она была перезаписана, что указывает на неправильный тип окончания строки. Бегать dos2unix
в вашем файле сценария, чтобы исправить это. Возможно, это какой-то другой заблудший персонаж. Отобразите ваш скрипт, используя hexdump
или cat -v
чтобы раскрыть это. Эта проблема часто возникает, когда вы используете редактор Windows для файла Unix.
Вместо этой строки:
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
который не полагается на ls
который не предназначен для использования в скриптах / каналах. Такой способ также с большей вероятностью будет работать в тех случаях, когда имена файлов содержат пробелы.
Вы можете цитировать так, как вы это делаете, но этот пример может быть лучше, поскольку он работает, если в именах файлов есть пробелы:
if [ ! -d "$BACKUP_DIR/$line" ]; then
mkdir "$BACKUP_DIR/$line"
Лучше использовать $()
вместо обратных кавычек и cat
не требуется (также упрощенное цитирование):
REVISION=$(awk '{print $1}' "$REPOSITORY_DIR/$line/db/current" )
И есть еще места, где можно упростить цитирование.