PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : unexpected EOF while looking for matching `"'



Eagle
12-12-2007, 14:27
Hallo,

ich schlage mich mit diesem Backupskript und der Fehlermeldung

/bin/backup.sh
||
| [/var/tmp/snapshoot] FILESYS |
/bin/backup.sh: line 352: unexpected EOF while looking for matching ``'
/bin/backup.sh: line 354: syntax error: unexpected end of file

herum. Zeile 352 beinhaltet

$LOGGER "$SUBJECT"
und Zeile 354 ist die letzte Zeile nach dem abschliessenden "fi".



#!/bin/bash
# Backup-Script
# Das Script startet taeglich um 23.00 Uhr. Abhängig vom Wochen-
# tag werden die Sicherungsvariablen gesetzt, das Band zurueckgespult
# oder aufgeworfen und der Betreuer per Mail benachrichtigt.
# -------------------------------------------------------------------

# Variablen fuer beide Backuptypen:
WEEKDAY=`date "+%u"`
DATUM=`date "+%Y-%m-%d_%H"`
DATE=`date "+%d-%m-%Y"`
TEMP="/var/tmp"
DIR="/var/log/archivelog"
LOGDIR="/var/log/backup"
TAPESTATUS="$LOGDIR/tapestatus-$DATUM.log"
BACKOUT="$TEMP/backout"
BACKERR="$TEMP/backerr"
hasError=""
COMMAND="/bin/tar"
MUTT="/usr/bin/mutt"
LOGGER="/usr/bin/logger"
SUBJECT1="Bandwechsel fuer Vollsicherung, Band:"
SUBJECT2="Bandwechsel fuer Tagessicherung, Band:"
USERMAIL=markus.louis@immo-team.de
INDEXFILE=$(cat $TEMP/backupid)
ADMINMAIL=root@samba.immo-team.local
# FILESYSTEME="/etc /doesnot-exist /root"
FILESYSTEME="/home/ /data/Dokumente /data/makler2000 /backup"

case "$INDEXFILE" in
1)
ID=I-1
;;
2)
ID=I-2
;;
3)
ID=II-1
;;
4)
ID=II-2
;;
5)
ID=III-1
;;
6)
ID=III-2
;;
7)
ID=IV-1
;;
8)
ID=IV-2
;;
esac

if [ "$WEEKDAY" = "1" ]; then
# Variablen fuer Vollbackup:
IDENTY="Vollbackup"
IDENT=${IDENTY}_${ID}
ID2="Sicherung vom "
INDEXSTRING=${DATE}
BACKUP=$FILESYSTEME
TAPE="/dev/st0"
OPTIONS="--create --verbose --one-file-system \
--file=$TAPE --totals \
--ignore-failed-read \
--blocking-factor=128 \
-V "$INDEXSTRING""

# Spezielle Funktionen:
preBackup () {
logme "+ preBackup: start"

# -- hier koennen Tasks vor der Sicherung ausgefuehrt werden,
# -- etwa der Dump einer Datenbank oder einen Dienst anhalten
mt -f $TAPE rewind 1>> $TAPESTATUS 2>&1 || hasError="${hasError}Rewind"
logme "- preBackup: finished"
}
else

# Variablen fuer inkrementelles Backup:
IDENTY="Incremental_Backup"
IDENT=${IDENTY}_${ID}
ID2="Sicherung vom "
INDEXSTRING=${DATE}
SNAPSHOOT="$TEMP/snapshoot"
BACKUP=$SNAPSHOOT
TAPE="/dev/nst0"
TIME="-mmin -1440"
TYPE=" -type f"
OPTIONS="--create --verbose --one-file-system \
--files-from=$SNAPSHOOT \
--file=$TAPE --totals \
--ignore-failed-read \
--blocking-factor=128 \
-V "$INDEXSTRING""

# Spezielle Funktionen:
preBackup () {
logme "+ preBackup: start"
/usr/bin/find $FILESYSTEME $TIME $TYPE > $SNAPSHOOT

# -- hier koennen Tasks vor der Sicherung ausgefuehrt werden,
# -- etwa der Dump einer Datenbank oder einen Dienst anhalten

logme "- preBackup: finished"
}
fi

IDSTRING=${IDENT}_${DATUM}
INDEX="$DIR/$INDEXSTRING.log"
HEADER="$INDEXSTRING"
LOGFILE="$LOGDIR/${IDSTRING}.log"
ARCHIVE="$DIR/$IDSTRING.log"

# ---------------------------------------
# Funktionen

initialize () {
if [ ! -d $LOGDIR ]; then
mkdir -p $LOGDIR
fi
: > $TAPESTATUS
: > $LOGFILE
: > $BACKOUT
: > $BACKERR
}

logme () {
DATUM=`date "+%Y-%m-%d %H:%M"`
echo -e "$DATUM $1" >> $LOGFILE
}

postBackup() {
logme "+ postBackup: start"

# -- Aufraeumarbeiten nach einer Sicherung
# -- z.B. Dienste wieder starten

# Wirft die Vollsicherung nach dem Sicherungsjob am Montag aus
#if [ "$WEEKDAY" = "1" ]; then
# mt -f /dev/st0 eject
#fi

# Wirft die inkrementelle Sicherung nach dem Sicherungsjob am Sonntag aus
if [ "$WEEKDAY" = "7" ]; then
mt -f /dev/nst0 rewind
mt -f /dev/nst0 eject
fi


logme "- postBackup: finished"
}

#==========MAIN=================================== ==========
# Sicherung als inkrementelles Tagesbackup am Dienstag(2),
# Mittwoch(3), Donnerstag(4), Freitag(5), Samstag(6) und Sonntag(7).
# Montags(1) Vollbackup.

initialize

# ---------------------------------------
# vor dem Backup

preBackup

logme "+ check tape status"

mt -f $TAPE status 1>> $TAPESTATUS 2>&1 || hasError="FirstStatus "
mt -f $TAPE tell 1>> $TAPESTATUS 2>&1 || hasError="FirstStatus "
#mt -f $TAPE eom 1>> $TAPESTATUS 2>&1 || hasError="${hasError}End of media"

if grep WR_PROT $TAPESTATUS > /dev/null
then
hasError="${hasError}WriteProtect "
fi

if [ "$hasError" == "" ]; then
logme "- check tape status: ok"
else
logme "- check tape status: errors on: $hasError"
fi

# ---------------------------------------
# Sicherung

# debug
echo "|$hasError|"

if [ "$hasError" == "" ]; then

logme "+ starting backups"

for filesys in $BACKUP; do
logme "+-> next backup: $filesys"

$COMMAND $OPTIONS -C $filesys . \
1>> $BACKOUT 2>> $BACKERR || hasError="${hasError} [$filesys]"

done

if [ "$hasError" == "" ]; then
logme "- backups done"
else
logme "- backups done: errors on: $hasError"
hasError="$hasError FILESYS "
fi
else
logme "!!! tape error, no backup done"
fi

# -- debug
echo "|$hasError|"

# ---------------------------------------
# Nach dem Backup

lastError=""

logme "+ unload tape"
mt -f $TAPE status 1>> $TAPESTATUS 2>&1 || lastError="LastStatus "
#mt -f $TAPE rewoff 1>> $TAPESTATUS 2>&1 || lastError="${lastError}Unload "

if [ "$lastError" == "" ]; then
logme "- unload tape: done"
else
logme "- unload tape: errors: $lastError"
hasError="${hasError} $lastError"
fi

if [ $WEEKDAY == "7 ]; then
INDEXFILE=$(($INDEXFILE+1))
else
if [ $WEEKDAY == "1" ]; then
INDEXFILE=$(($INDEXFILE+1))
else
INDEXFILE=$(($INDEXFILE+0))
fi
fi


case "$INDEXFILE" in
1)
ID=I-1
if [ $WEEKDAY == "1" ]; then
echo Bitte wechseln Sie das Sicherungsband und legen das Band mit der Bezeichnung $ID ein. Heute Nacht bis Sonntagnacht finden die inkrementellen Sicherungen statt. |$MUTT -s "${SUBJECT2}-${ID}" $USERMAIL;
fi
;;
2)
ID=I-2
if [ $WEEKDAY == "7" ]; then
echo Bitte wechseln Sie das Sicherungsband und legen das Band mit der Bezeichnung $ID ein. Heute Nacht findet die Vollsicherung statt. Und reinigen Sie das Bandlaufwerk mit dem Reinigungsband! |$MUTT -s "${SUBJECT1}-${ID}" $USERMAIL;
fi
;;
3)
ID=II-1
if [ $WEEKDAY == "1" ]; then
echo Bitte wechseln Sie das Sicherungsband und legen das Band mit der Bezeichnung $ID ein. Heute Nacht bis Sonntagnacht finden die inkrementellen Sicherungen statt. |$MUTT -s "${SUBJECT2}-${ID}" $USERMAIL;
fi
;;
4)
ID=II-2
if [ $WEEKDAY == "7" ]; then
echo Bitte wechseln Sie das Sicherungsband und legen das Band mit der Bezeichnung $ID ein. Heute Nacht findet die Vollsicherung statt. Und reinigen Sie das Bandlaufwerk mit dem Reinigungsband! |$MUTT -s "${SUBJECT1}-${ID}" $USERMAIL;
fi
;;
5)
ID=III-1
if [ $WEEKDAY == "1" ]; then
echo Bitte wechseln Sie das Sicherungsband und legen das Band mit der Bezeichnung $ID ein. Heute Nacht bis Sonntagnacht finden die inkrementellen Sicherungen statt. |$MUTT -s "${SUBJECT2}-${ID}" $USERMAIL;
fi
;;
6)
ID=III-2
if [ $WEEKDAY == "7" ]; then
echo Bitte wechseln Sie das Sicherungsband und legen das Band mit der Bezeichnung $ID ein. Heute Nacht findet die Vollsicherung statt. Und reinigen Sie das Bandlaufwerk mit dem Reinigungsband! |$MUTT -s "${SUBJECT1}-${ID}" $USERMAIL;
fi
;;
7)
ID=IV-1
if [ $WEEKDAY == "1" ]; then
echo Bitte wechseln Sie das Sicherungsband und legen das Band mit der Bezeichnung $ID ein. Heute Nacht bis Sonntagnacht finden die inkrementellen Sicherungen statt. |$MUTT -s "${SUBJECT2}-${ID}" $USERMAIL;
fi
;;
8)
ID=IV-2
if [ $WEEKDAY == "7" ]; then
echo Bitte wechseln Sie das Sicherungsband und legen das Band mit der Bezeichnung $ID ein. Heute Nacht findet die Vollsicherung statt. Und reinigen Sie das Bandlaufwerk mit dem Reinigungsband! |$MUTT -s "${SUBJECT1}-${ID}" $USERMAIL;
fi
;;
esac


if [ $INDEXFILE == "8" ]; then
INDEXFILE=1
echo $INDEXFILE > $TEMP/backupid
else
echo $INDEXFILE > $TEMP/backupid
fi

# -- debug
echo "|$hasError|"

postBackup

# ---------------------------------------
# Logfile komprimieren und Archiv-File anlegen

zcat $BACKOUT >> $LOGFILE
#cp $BACKOUT >> $LOGFILE
cp $BACKOUT $ARCHIVE
gzip -9 $LOGFILE

# ---------------------------------------
# Infomail senden

if [ "$hasError" == "" ]; then
$MUTT -x -s "$IDSTRING backup done, OK" $ADMINMAIL < $LOGFILE
else
ATTACH=""
case "$hasError" in
*FirstStatus*)
SUBJECT="$IDSTRING backup ERROR: no tape available"
;;
*Rewind*)
SUBJECT="$IDSTRING backup ERROR: could not rewind tape"
;;
*WriteProtect*)
SUBJECT="$IDSTRING backup ERROR: tape is write protected"
;;
*FILESYS*)
SUBJECT="$IDSTRING backup ERROR: error with filesystems"
gzip -f -9 $BACKOUT
ATTACH="-a $BACKOUT.gz"
;;
*LastStatus*)
SUBJECT="$IDSTRING backup done, ERROR: last status problem, suspect"
;;
*Unload*)
SUBJECT="$IDSTRING backup done, ERROR: could not unload tape"
;;
*)
SUBJECT="$IDSTRING backup ERROR: unknown error"
;;
esac

$MUTT -x -a $TAPESTATUS -a $BACKERR $ATTACH -s "$SUBJECT" $ADMINMAIL < $LOGFILE
# -- syslog Eintrag erzeugen

$LOGGER "$SUBJECT"
fi



Ich habe das Script auch schon ohne den letzten Teil nach "Infomail versenden" versucht zu testen, mit dem Erfolg, dass die gleiche Fehlermeldung kommt, nur weiter oben.
Mein Vi ist auf encoding=utf-8 gesetzt und wenn ich "set list" mache, dann sehe ich in jeder Zeile bis Zeile 353 das Zeichen "$".

Sieht jemand unter Euch, was die fehlermeldung und den Programmabruch bewirken könnte?

Vielen Dank

Andreas

Eagle
12-12-2007, 14:41
Mit dem Befehl

sh -vx backup.sh 2>&1 | tee logfile.log
habe ich mal das Skript debugt. Ich habe es angehängt, nur den Grund für das Abbrechen sehe ich noch nicht.

Grüsse
Andreas

Eagle
12-12-2007, 16:37
Hallo,

tut das gut! Wenn du deine Probleme selber lösen kannst:





if [ $WEEKDAY == "7 ]; then
INDEXFILE=$(($INDEXFILE+1))
else
if [ $WEEKDAY == "1" ]; then
INDEXFILE=$(($INDEXFILE+1))
else
INDEXFILE=$(($INDEXFILE+0))
fi
fi


In diesem Code-Abschnitt habe ich geschlampert. Der Wochentags-Zahl / fehlt das '"'-Zeichen. Schade, dass das System nicht gleich sagt Zeile 233. Dann wäre mir viel Frust und Sucherei erspart geblieben.

Hauptsache, das Script läuft heute Nacht wieder.

Grüsse

Andreas

undefined
12-12-2007, 16:59
Du arbeitest mit Zahlen ;)


if [ `expr $WEEKDAY` -eq 7 ]; then
INDEXFILE=$(expr $INDEXFILE + 1)
elif [ `expr $WEEKDAY` -eq 4 ]; then
INDEXFILE=$(expr $INDEXFILE + 1)
else
INDEXFILE=$(expr $INDEXFILE)
fi

jan61
13-12-2007, 00:34
Moin,

den Ausdruck `expr $...` kannst Du weglassen und stattdessen nur $... benutzen. Die bash unterscheidet nicht zwischen numerischen und alphanumerischen Variablen und expr auch nicht:
jan@jack:~> expr 1
1
jan@jack:~> expr A
A
jan@jack:~> expr 01
01
Man muss also sowieso vorher gewährleisten, dass bei einem numerischen Vergleich (-eq, -ne, ...) die zu testende Variable numerisch ist. Der Hinweis von undefined darauf, dass man bei einem numerischen Wert auch die numerischen Vergleichsoperatoren benutzen sollte, ist aber auf jeden Fall wichtig:

jan@jack:~> test 07 = 7 && echo gleich
jan@jack:~> test 07 -eq 7 && echo gleich
gleich
jan@jack:~> test 08 \> 7 && echo 08 \> 7
jan@jack:~> test 08 -gt 7 && echo 08 \> 7
08 > 7
jan@jack:~> test 08 \< 7 && echo 08 \< 7
08 < 7
jan@jack:~> test 08 -lt 7 && echo 08 \< 7
jan@jack:~>
Jan

jan61
14-12-2007, 12:50
...Schade, dass das System nicht gleich sagt Zeile 233. Dann wäre mir viel Frust und Sucherei erspart geblieben...

Woher soll die Shell das wissen? Da hätte ja auch durchaus eine (gewollte und syntaktisch korrekte) Variablendefinition über mehrere Zeilen stehen können.

Jan