2013-06-18 2 views
1

я получаю эту ошибку, когда я запускаю мой Bash скрипт:синтаксиса: неожиданный конец файла

ошибка синтаксиса: неожиданный конец файла

Брус действительно найти, где ошибка, искали часов и по-прежнему получают эту ошибку.

Вот сценарий надеюсь, кто-то не могу указать меня в правильном направлении:

#!/bin/bash 


BACKUPDIR=~/backup 
SCRIPTDIR=~/respaldar 
BACKUPFILE=/respaldo.$(date +%F).bz2 
BACKUPHOST=199.21.112.70 
COUNT=$(ls $BACKUPDIR | wc -l) 
TRESHOLD=7 




if [[ ! -e $BACKUPDIR ]] 
then 
    echo "Creating Backup Directory because it doesn\'t exist !" 
    mkdir ~/backup 
    COUNT=0 
# exit 0 
else 
    COUNT=$(ls $BACKUPDIR | wc -l) 
fi 




if [[ $COUNT -le $THRESHOLD ]] 
then 
     tar -cjvf $BACKUPDIR/$BACKUPFILE $SCRIPTDIR 
     if [[ $? -ne 0 ]]; then echo "Problems Creating Backup File;" fi 
     scp $BACKUPDIR/$BACKUPFILE $BACKUPHOST: 
     if [[ $? -ne 0 ]]; then echo "Problems Copying Backup File to Backup Host;" fi 
fi 







#END 

Цените помощь.

+6

', если [[$? -ne 0]]; затем echo «Проблемы с созданием резервного файла»; fi' должен иметь точку с запятой до 'fi'. – fedorqui

+0

См. Http://www.shellcheck.net/ для автоматического средства тестирования. –

+1

'COUNT = $ (ls $ BACKUPDIR | wc -l)' проклят глупо. 'files = (" $ backupdir "/ *); count = $ {# files [@]} 'имеет тот же эффект без всех накладных расходов на выполнение всех вызовов fork и exec, необходимых для появления' ls' в конвейере ... и не зависит от поведения, определенного реализацией of 'ls'. (вывод 'ls' должен гарантировать один вход в строку, но только тогда, когда он не будет на терминале, и в этом случае он определяется реализацией ... поэтому, если вы полагаетесь на то, что' ls' выглядит на если вы запустите его на свой экран, это может дать совсем другой выход, идущий к конвейеру!) –

ответ

3

Я copyed весь материал, чтобы и заметил то же самое, как fedorqui:

if [[ $? -ne 0 ]]; then echo "Problems Creating Backup File;" fi 
... 
if [[ $? -ne 0 ]]; then echo "Problems Copying Backup File to Backup Host;" fi 

; находится перед " и должно быть после.

Я хотел бы предложить использовать более короткое решение в обоих случаях:

[ $? -ne 0 ] && echo "Problems Creating Backup File">&2 && exit 1 

Это приведет к выходу, если не удается. Или даже более разговорчивая версия:

tar -cjvf $BACKUPDIR/$BACKUPFILE $SCRIPTDIR || \ 
    { echo "Problems Creating Backup File">&2;exit 1;} 

Или, если Вы хотите, чтобы увидеть сообщение об ошибке, только если весь процесс не:

tar -cjvf $BACKUPDIR/$BACKUPFILE $SCRIPTDIR && \ 
    scp $BACKUPDIR/$BACKUPFILE $BACKUPHOST: || \ 
    { echo "Backup failed">&2;exit 1;} 
+0

Еще короче: «tar -cjvf» $ BACKUPDIR/$ BACKUPFILE "" $ SCRIPTDIR "|| echo «Проблемы с созданием файла резервной копии» && exit 1' – doubleDown

+0

Я имею в виду, что сценарий будет короче, а не строка ... – doubleDown

+2

@doubleDown: '... || ... && exit' не подходит! 'exit' будет выполнен, даже если' tar' заканчивается без проблемы. – TrueY

Смежные вопросы