2017-02-21 7 views
0

ОК, так что я начинаю начинать с скриптов bash, и я знаю, что вопрос, вероятно, сформулирован немного неловко, но я буду предельно ясен!Проблема с обработкой ошибок в моем первом скрипте bash

Я написал следующий сценарий для создания резервной копии репозиториев в папке. Сценарий выглядит следующим образом:

#!/bin/bash 

SVNREPO="/var/svn" 
TEMP="/var/tmp" 
BACKUP="/home/helix/backups" 

cd $SVNREPO 

if [ $# -eq 0 ]; then 
    for REPO in *; do 
     ARRAY+=($REPO) 
    done 
else 
    for REPO in [email protected]; do 
     ARRAY+=($REPO) 
    done 
fi 

for REPO in ${ARRAY[@]}; do 
    svnadmin dump $SVNREPO/$REPO -r HEAD | gzip > $TEMP/$REPO.svn.gzip sd 
    cp $TEMP/$REPO.svn.gzip $BACKUP/$REPO.svn.gzip 
    rm $TEMP/$REPO.svn.gzip 
done 

Этот сценарий успешно производит .gzip подпорки из всех хранилищ в «вар/SVN», когда скрипт вызывается без аргументов, и создает .gzip резервные копии определенных хранилищ которые называются аргументами. Большой!

Однако, если сценарий запущен с аргументом, который не соответствует существующему репозиторию, программа сбой выдаст сообщение об ошибке: svnadmin: E000002: Can't open file '/var/svn/ada/format': No such file or directory. Я пытаюсь добиться этой ошибки и распечатать на консоли более удобный вывод. Я пытался сделать это, используя «ловушку».

Сначала я добавил следующую строку:

trap 'echo ERROR! The repository or repositories that you are trying to backup do not exist!' ERR 

... а потом я нажал ошибку в/DEV/нуль в этой точке в финале для цикла:

svnadmin dump $SVNREPO/$REPO -r HEAD 2>/dev/null | gzip > $TEMP/$REPO.svn.gzip 

Я оттолкнул к файлу/dev/null в том месте, где я был, потому что это ошибка программы. Однако сценарий больше не работает. Что я здесь делаю неправильно? Это вопрос, связанный с наличием 2>/dev/null в середине строки? Если да, то как я мог бы реорганизовать этот код так, чтобы он не требовал, чтобы канал находился в середине линии?

Большое спасибо за любую помощь, я надеюсь, что мой вопрос достаточно ясен! Для того, чтобы подтвердить, окончательный нерабочим код выглядит следующим образом:

#!/bin/bash 

SVNREPO="/var/svn" 
TEMP="/var/tmp" 
BACKUP="/home/helix/backups" 

cd $SVNREPO 

if [ $# -eq 0 ]; then 
    for REPO in *; do 
     ARRAY+=($REPO) 
    done 
else 
    for REPO in [email protected]; do 
     ARRAY+=($REPO) 
    done 
fi 

trap 'echo ERROR! The repository or repositories that you are trying to backup do not exist!' ERR 

for REPO in ${ARRAY[@]}; do 
    svnadmin dump $SVNREPO/$REPO -r HEAD 2>/dev/null | gzip > $TEMP/$REPO.svn.gzip sd 
    cp $TEMP/$REPO.svn.gzip $BACKUP/$REPO.svn.gzip 
    rm $TEMP/$REPO.svn.gzip 
done 
+1

Вы можете проверить, чтобы увидеть, если каталог существует с ', если [каталог имя-d] 'или для проверки выходных файлов fa вместо' -f'. – cdarke

+1

Различия и переменные двойных кодов, они решат большинство проблем в 'bash',' для REPO в "$ @" 'и' для REPO в '$ {ARRAY [@]} "' – Inian

+1

@cdarke Привет, я могу вероятно, включите это в мой скрипт, чтобы заставить его работать. – jamessct

ответ

1

Я не знаю точно, как trap команда работает, но я предлагаю другой способ, который может решить вашу проблему другим способом:

Первая до вашего for цикла, добавьте следующую строку:

set -o pipefail 

Это означает, что, когда любая команда в трубе не удается, последний код выхода ($?) будет содержать код ошибки, если какие-либо не удалось.

На линии сразу после svnadmin вызова, я предложил бы добавить следующее:

if [ $? -ne 0 ]; then 
    echo "ERROR! Received error code $? for repository '$REPO'." 
    continue 
fi 

Конечно, Вы можете изменить сообщение об ошибке на свой вкус. Функциональность должна быть ясной: если svnadmin или bzip сбой, он выведет сообщение об ошибке и перейдет к следующему элементу в цикле for.

Надеюсь, это поможет.

+0

Я пробовал это, и он дает ошибку, независимо от того, имеются ли правильные, неправильные или отсутствующие аргументы. – jamessct

1

Использование @cdarke предложение проверить, существует ли файл, теперь у меня есть он работает со следующим кодом:

#!/bin/bash 

SVNREPO="/var/svn" 
TEMP="/var/tmp" 
BACKUP="/home/helix/backups" 

cd $SVNREPO 

if [ $# -eq 0 ]; then 
    for REPO in *; do 
     ARRAY+=($REPO) 
    done 
else 
    for REPO in [email protected]; do 
     ARRAY+=($REPO) 
    done 
fi 

for REPO in ${ARRAY[@]}; do 
    if [ -f $SVNREPO/$REPO/format ]; then 
     vnadmin dump $SVNREPO/$REPO -r HEAD 2>/dev/null | gzip > $TEMP/$REPO.svn.gzip 
     cp $TEMP/$REPO.svn.gzip $BACKUP/$REPO.svn.gzip 
     rm $TEMP/$REPO.svn.gzip 
    else 
     echo ERROR! The repository $REPO does not exist. No backup has been made for this argument. 
    fi 
done 
+0

Если вы нашли ответ на свой вопрос, вы должны принять ответ (даже свой собственный ответ), нажав галочку рядом с ответом. –