2017-03-09 5 views
0

Ich habe Probleme bei der Suche nach Fehler im Bash-Skript für die Behandlung von Backup: täglich, monatlich, jährlich. Hier ist das Skript:Fehler bei der Sicherung Bash-Skript: Syntaxfehler in der Nähe von unerwarteten Token `Newline '

#!/bin/bash 

echo > /home/alpha/folder/keep.txt 
#writing dates of the backups that should be kept to the array 

for i in {0..7}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done 
for i in {0..4}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done 
for i in {0..12}; do 
     DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W))) 
     for ((AY=$(date -d "$(date +%Y-%m-15) -$i month" +%Y); AY < $(date +%Y); AY++)); do 
     ((DW+=$(date -d $AY-12-31 +%W))) 
     done 
     ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++)) 
done 
for i in {0..30}; do 
     DW=$(date +%-W) 
     for ((AY=$(($(date +%Y)-i)); AY < $(date +%Y); AY++)); do 
     ((DW+=$(date -d $AY-12-31 +%W))) 
     done 
     ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++)) 
     done 

#writing the array to file keep.txt line by line 
for i in ${!keep[@]}; do echo $i >> /home/alpha/folder/keep.txt; done 

#delete all files that not mentioned in keep.txt 
cd /home/alpha/folder 
ls -1 /home/alpha/folder/ | sort /home/alpha/folder/keep.txt /home/alpha/folder/keep.txt - | uniq -u | xargs rm -rf 
rm /home/alpha/folder/keep.txt 

Wenn ich versuche, um das Skript auszuführen, führt Fehlermeldung:

./back.sh: line 12: syntax error near unexpected token `newline' ./back.sh: line 12: ` done' 

Wo habe ich das Drehbuch falsch gemacht?

+0

Können Sie bitte mehr mit hilfreicher Link vielleicht erarbeiten. –

+0

Es tut mir leid, es war ein Fehler meinerseits beim Testen des Skripts, ich entfernte den Kommentar – Aserre

+1

Bunch von Problemen, die nicht doppelt zitiert die Variablen, kopieren Sie Ihr Skript einfügen unter http://www.shellcheck.net/ und sehen es für sich – Inian

Antwort

1

Ihr date Ausdruck scheint sich im arithmetischen Kontext falsch zu verhalten. Hinzufügen von temporären Variablen gelöst Ihr Problem für mich:

#!/bin/bash 

echo > /home/alpha/folder/keep.txt 
#writing dates of the backups that should be kept to the array 

for i in {0..7}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done 
for i in {0..4}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done 
for i in {0..12}; do 
     DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W))) 
     begin=$(date -d "$(date +%Y-%m-15) -$i month" +%Y) 
     for ((AY=begin; AY < $(date +%Y); AY++)); do 
     ((DW+=$(date -d $AY-12-31 +%W))) 
     done 
     ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++)) 
done 
for i in {0..30}; do 
     DW=$(date +%-W) 
     begin=$(($(date +%Y)-i)) 
     for ((AY=begin; AY < $(date +%Y); AY++)); do 
     ((DW+=$(date -d $AY-12-31 +%W))) 
     done 
     ((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++)) 
     done 

#writing the array to file keep.txt line by line 
for i in ${!keep[@]}; do echo $i >> /home/alpha/folder/keep.txt; done 

#delete all files that not mentioned in keep.txt 
cd /home/alpha/folder 
ls -1 /home/alpha/folder/ | sort /home/alpha/folder/keep.txt /home/alpha/folder/keep.txt - | uniq -u | xargs rm -rf 
rm /home/alpha/folder/keep.txt 

Aber ich bin nicht sicher, warum der Ausdruck in dem Rechenblock misbehaves.

+0

Array-Erweiterungen sollten doppelt zitiert werden, 'für i in" $ {! Keep [@]} "' – Inian

+0

@Inian Ich weiß, dass dies Best Practice ist, aber dies hat keinen Einfluss auf das Problem OP hat. Für diese Antwort habe ich den OP-Code zusammen mit meinen Vorschlägen kopiert/eingefügt. Er kann sich auf den Shellcheck-Link beziehen, den Sie in den Kommentaren gepostet haben, um seinen Code weiter zu verbessern. Da die im Array gespeicherten Werte Zeitstempel sind, hat das Zitat höchstwahrscheinlich keinen Einfluss auf die Ergebnisse. – Aserre

Verwandte Themen