Problem mit Script

1337

Lt. Junior Grade
Registriert
Aug. 2010
Beiträge
324
Hallo,
ich habe mich an einem Script versucht, welches mir in bestimmten Intervallen ein bestimmtes Verzeichnis kopiert und die überzähligen Backups löscht.
Das ganze soll später auf nem vServer in einem screen laufen.
Aber er meckert immer, da wäre ein Syntax-Fehler ("near unexpected token `else'", `else echo "" "; Zeile 56), lokal funktioniert jedoch alles. Ich bin ratlos!

Code:
# !/bin/bash
# -------------------------
# Einstellungen:

DIR=/opt/server #Quellverzeichnis
BACKUPDIR=/opt/backups #Zielverzeichnis
SLEEPFOR=3600 #Intervall in Sekunden
MAXBACKUPS=24 #History

# -------------------------

echo "***************************************"
echo "Backup-Script"
echo "***************************************"
echo ""
echo "Das Skript wurde mit folgenden Parametern gestartet:"
echo "Quellverzeichnis: " $DIR"/"
echo "Zielverzeichnis: " $BACKUPDIR"/"
echo "Intervall: " $SLEEPFOR " Sekunden"
echo "History: " $MAXBACKUPS " Backups"
echo ""
echo ""

while :
do

TIME=$(date '+%d.%m._%H:%M:%S')

# neues Backup erstellen
cp -r $DIR/ $BACKUPDIR/$TIME/

# Falls Dateirechte im Zielverzeichnis fehlen, nächste Zeile entkommentieren
# chmod 777 $BACKUPDIR/$TIME/

if [ -e $BACKUPDIR/$TIME/ ]
then
echo "Backup wurde um " $(date '+%H:%M:%S') " Uhr erfolgreich erstellt."
echo ""
else
echo ""
fi
# ---

#alte Backups entfernen
if [ $(ls -t -r -1 $BACKUPDIR | wc -l) -gt $MAXBACKUPS ]
then

while [ $(ls -t -r -1 $BACKUPDIR | wc -l) -gt $MAXBACKUPS ]
do
ls -t -r -1 $BACKUPDIR |head --lines 1 | rm -r $BACKUPDIR/$(xargs)
done

echo "Alte Backups wurden um " $(date '+%H:%M:%S') " Uhr erfolgreich entfernt."
echo ""

else echo ""

fi
#---

sleep $SLEEPFOR
done
 
Zeile 56: Nimm das echo "" auf eine neue Zeile, anstatt es direkt hinter dem else zu lassen. Wobei... eigentlich sollte das schon gehen.
 
Grade ausprobiert, jetzt meckert er in der letzten Zeile beim done ("syntax error near unexpected token `done'", Zeile 62).
Noch zur Info: lokal auf Linux Mint läufts, der Server läuft auf Debian. Vielleicht hat es damit etwas zu tun.
 
Zuletzt bearbeitet:
Naja, ich seh direkt keinen Fehler, aber irgendwas wird schon sein. Welche version der bash ist denn aufm debian server am laufen? bash --version
 
GNU bash, version 3.2.39(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

Er meint auch vor dem Syntax Error einmal "command not found", und vor der großen Textausgabe am Anfang auch drei Mal. Vielleicht ist es wirklich die etwas ältere Bash-Version?
 
Zuletzt bearbeitet:
Also, noch vor

echo "***************************************"

kriegst du "command not found" errors?

Ev. mal #!/bin/bash ohne leerzeichen zwischen # und ! versuchen

Gibts die fehler auch, wenn du das script explizit per bash ausführst, also:

bash /pfad/zu/deinem/script
 
Zuletzt bearbeitet:
Ja, drei Stück sogar. Mit und ohne Leerzeichen habe ich bereits durchprobiert - keine Veränderung!
Und ja, die Ausgabe ist exakt die gleiche.
 
Zuletzt bearbeitet:
root@hostname:/verzeichnis# bash copy.sh
: command not found
: command not found
: command not found
***************************************
Backup-Script
***************************************

Das Skript wurde mit folgenden Parametern gestartet:
Quellverzeichnis: /opt/server/
Zielverzeichnis: /opt/backups/
Intervall: 3600 Sekunden
History: 24 Backups


: command not found
copy.sh: line 62: syntax error near unexpected token `done'
copy.sh: line 62: `done'
 
Zuletzt bearbeitet:
Das ergibt so keinen Sinn... Sind deine Leerzeilen auch wirklich leer? Wieso bringt es drei mal einen Error noch vor der Ausgabe? Da muss etwas sein, was ich nicht sehe
 
Ohne Leerzeilen fallen die "command not found"-Fehler weg. Der Syntax-Error bleibt. Ich poste nochmal den Code so, wie er jetzt ausgeführt wird, Fehler ist in Zeile 49:

Achja und fühl dich nicht minderwertig, ich sehe es ja auch nicht ^^

Code:
***************************************
Backup-Script
***************************************

Das Skript wurde mit folgenden Parametern gestartet:
Quellverzeichnis:  /opt/server/
Zielverzeichnis:  /opt/backups/
Intervall:  3600  Sekunden
History:  24  Backups


copy.sh: line 49: syntax error near unexpected token `done'
copy.sh: line 49: `done'

Code:
#!/bin/bash
#-------------------------
#Einstellungen:
DIR=/opt/server #Quellverzeichnis
BACKUPDIR=/opt/backups #Zielverzeichnis
SLEEPFOR=3600 #Intervall in Sekunden
MAXBACKUPS=24 #History
#------------------------
echo "***************************************"
echo "Backup-Script"
echo "***************************************"
echo ""
echo "Das Skript wurde mit folgenden Parametern gestartet:"
echo "Quellverzeichnis: " $DIR"/"
echo "Zielverzeichnis: " $BACKUPDIR"/"
echo "Intervall: " $SLEEPFOR " Sekunden"
echo "History: " $MAXBACKUPS " Backups"
echo ""
echo ""
while :
do
TIME=$(date '+%d.%m._%H:%M:%S')
# neues Backup erstellen
cp -r $DIR/ $BACKUPDIR/$TIME/
# Falls Dateirechte fehlen, nächste Zeile entkommentieren
# chmod 777 $BACKUPDIR/$TIME/
if [ -e $BACKUPDIR/$TIME/ ]
then
echo "Backup wurde um " $(date '+%H:%M:%S') " Uhr erfolgreich erstellt."
echo ""
else
echo ""
fi
# ---
#alte Backups entfernen
if [ $(ls -t -r -1 $BACKUPDIR | wc -l) -gt $MAXBACKUPS ]
then
while [ $(ls -t -r -1 $BACKUPDIR | wc -l) -gt $MAXBACKUPS ]
do
ls -t -r -1 $BACKUPDIR |head --lines 1 | rm -r $BACKUPDIR/$(xargs)
done
echo "Alte Backups wurden um " $(date '+%H:%M:%S') " Uhr erfolgreich entfernt."
echo ""
else
echo ""
fi
#---
sleep $SLEEPFOR
done
 
Mit welchem Editor bearbeitest du das script? Unter Windows ev? Schau zu, dass sämtliche Line Endings auch auf Unix Type (LF) und nicht Windows (CR LF) sind.
 
*hust, hust*
Und ich überleg noch ewig woran es denn liegen könnte...
Dass die Zeilenumbrüche auf Windows alle richtig angezeigt werden im Editor...hätte man ja gleich drauf kommen können. Ich schwöre ich bearbeite Skripte nur noch mit Notepad++ ! xD
Auf jeden Fall danke für deine Arbeit!
Und für alle die das hier später lesen: JA, es waren die Zeilenumbrüche... ich glaub ich geh mich jetzt schämen...
 
Zurück
Oben