Anzeige:
Ergebnis 1 bis 6 von 6

Thema: unexpected EOF while looking for matching `"'

  1. #1
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Ort
    Stuttgart
    Beiträge
    51

    Question unexpected EOF while looking for matching `"'

    Hallo,

    ich schlage mich mit diesem Backupskript und der Fehlermeldung
    Code:
     /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
    Code:
    $LOGGER "$SUBJECT"
    und Zeile 354 ist die letzte Zeile nach dem abschliessenden "fi".

    Code:
    #!/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

  2. #2
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Ort
    Stuttgart
    Beiträge
    51
    Mit dem Befehl
    Code:
    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

  3. #3
    Registrierter Benutzer
    Registriert seit
    14.02.2001
    Ort
    Stuttgart
    Beiträge
    51

    Smile Fehler gefunden

    Hallo,

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

    Zitat Zitat von Eagle Beitrag anzeigen
    Code:
    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

  4. #4
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Du arbeitest mit Zahlen
    PHP-Code:
    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 
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  5. #5
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Moin,

    den Ausdruck `expr $...` kannst Du weglassen und stattdessen nur $... benutzen. Die bash unterscheidet nicht zwischen numerischen und alphanumerischen Variablen und expr auch nicht:
    Code:
    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:
    Code:
    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
    Geändert von jan61 (13-12-2007 um 00:42 Uhr)

  6. #6
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von Eagle Beitrag anzeigen
    ...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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •