staging.inyokaproject.org

Kalender-Dateien(CalDav) via Script sichern Problem mit heredoc

Status: Gelöst | Ubuntu-Version: Ubuntu GNOME 17.10 (Artful Aardvark)
Antworten |

WesleyPipes

Anmeldungsdatum:
18. September 2018

Beiträge: 7

Hallo liebe Community,

Ich arbeite an einem Gentoo-System und versuche via shell-Script Kalender-Dateien von unserem CalDav-Server zu sichern.

Als Grundlage zu meinem Script, habe ich mich hier orientiert:

https://uriesk.wordpress.com/2015/02/13/backup-your-caldav-calendar-with-cadaver/

mein Backup-Script sieht wie folgt aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/sh

set -e

mkdir /tmp/calendar
cd /tmp/calendar


NAME="Manfred"
echo "Verarbeite Kalender von $NAME"
URL="http://UNSER_CAL_DAV_SRV/davical/caldav.php/$NAME/calendar"

curl -n $URL

#fetch filelist
cadaver $URL <<EOC| grep .ics | sed 's/.ics.*/.ics/' | sed 's/\ *//' > ./filelist
ls
exit
EOC

#download files
cadaver $URL <<EOA
`while read p; do
echo "get $p"
done < ./filelist`
exit
EOA
cd ..

tar cfvz /home/davcalbkp/calendar-$NAME`date +%Y.%m`.tar.gz /tmp/calendar/

rm -r /tmp/calendar

Wenn ich das Script so laufen lasse, macht er auch genau das was ich erwarte: es wird sich am CalDav-Server angemeldet(.netrc), der richtige Kalender geöffnet, die ICS-Dateien ausgelesen und diese widerum gepackt.

So weit alles gut. Nun habe ich mir im nächsten Schritt gedacht, da ich ja mehrere Kalender sichern will, ich gebe die Kalendernamen in einem Array an und lasse via Schleife jeden Kalender sichern.

Mein Ansatz ist dieser:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/sh

set -e

NAMEARRAY=("anne"
        "baerbel"
        "bea"
        "carsten"
        "david")

mkdir -p /tmp/calendar
cd /tmp/calendar


for i in ${NAMEARRAY[@]}
do
        NAME=$i
        echo "Verarbeite Kalender von $NAME"
        URL="http://UNSER_CALDAV_SRV/davical/caldav.php/$NAME/calendar"
        curl -n $URL
        #fetch filelist
        cadaver $URL <<EOC| grep .ics | sed 's/.ics.*/.ics/' | sed 's/\ *//' > ./filelist
        ls
        exit
        EOC

        #download files
        cadaver $URL <<EOC
        `while read p; do
        echo "get $p"
        done < ./filelist`
        exit
        cd ..
        EOC

        tar cfvz /home/davcalbkp/calendar-$NAME`date +%Y.%m`.tar.gz /tmp/calendar/


done



rm -r /tmp/calendar

Wenn ich den Script laufen lasse, bekomme ich Rückmeldung, dass an der heredoc-Anweisung kein Abschluss ist

1
2
Zeile 44: Warnung: Das in der Zeile 23 beginnende Here-Dokument geht bis zum Dateiende (erwartet wird `EOC').
Zeile 45: Syntax Fehler: Unerwartetes Dateiende.

Ich finde den Fehler nicht, verschiedene Ansätze (u.A. die beiden "exit" auskommentieren, weil ich dachte dass diese zur vorzeitigen Beendigung der Schleife führen | Leerzeichen vor der heredoc-Anweisung entfernt | etc) führten alle nicht zu dem Ziel. Egal wo ich ansetze bekomme ich die oben genannte Fehlermeldung.

Ich weiß nicht mehr wo ich noch ansetzen soll und wäre sehr für ein bißchen Hilfe dankbar.

Wenn es einen Ansatz ohne heredoc-Anweisung gibt (vermute aber die wird hier benötigt um aus Cadaver wieder rauszukommen(?)), bin ich auch nicht unglücklich darüber.

Danke und Gruß erstmal

Wes

PS: Ich musste zwingend eine Distribution angeben um weiter zu kommen - die angegebene stimmt aber nicht (sorry dafür) - wie schon Anfangs geschrieben Gentoo - aber ich denke das dürfte jetzt für shell nicht weiter relevant sein

WesleyPipes

(Themenstarter)

Anmeldungsdatum:
18. September 2018

Beiträge: 7

Es ist mir echt peinlich!

Gerade als ich auf die Freigabe meines Threads warte, und noch herumprobiere und recherchiere stosse ich doch glatt auf den Fehler. Liebe Community, liebe Moderatoren - Entschuldigung dafür! (Aber vielleicht stolpert ja jemand über das gleiche Problem und dann ist der Beitrag doch hilfreich)

Der Fehler lag daran, dass ich mich beim Scripten an die Schleifen-Strukturierung (einrücken) gehalten habe:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
for i in ${NAMEARRAY[@]}
do
        NAME=$i
        echo "Verarbeite Kalender von $NAME"
        URL="http://UNSER_CALDAV_SRV/davical/caldav.php/$NAME/calendar"
        curl -n $URL
        #fetch filelist
        cadaver $URL <<EOC | grep .ics | sed 's/.ics.*/.ics/' | sed 's/\ *//' > ./filelist
        ls
        exit
        EOC

        #download files
        cadaver $URL <<EOA
        `while read p; do
        echo "get $p"
        done < ./filelist`
        exit
        cd ..
        EOA

        tar cfvz /home/davcalbkp/calendar-$NAME`date +%Y.%m`.tar.gz /tmp/calendar/


done

Bei heredoc-Anweisungen ist es aber so (und das habe ich eben auch falsch gelesen) das vor dem Abschluss der heredoc-Anweisung keine Leerzeichen stehen dürfen

Quelle: http://tldp.org/LDP/abs/html/here-docs.html (ganz unten rotes Ausrufezeichen)

... The closing limit string, on the final line of a here document, must start in the first character position. There can be no leading whitespace. Trailing whitespace after the limit string likewise causes unexpected behavior. The whitespace prevents the limit string from being recognized ...

Richtig muss der Code so lauten (und so funktioniert er auch):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/sh

set -e

NAMEARRAY=("anne"
        "baerbel"
        "bea"
        "carsten"
        "david")

mkdir -p /tmp/calendar
cd /tmp/calendar


for i in ${NAMEARRAY[@]}
do
        NAME=$i
        echo "Verarbeite Kalender von $NAME"
        URL="http://UNSER_CALDAV_SRV/davical/caldav.php/$NAME/calendar"
        curl -n $URL
        #fetch filelist
        cadaver $URL <<EOC | grep .ics | sed 's/.ics.*/.ics/' | sed 's/\ *//' > ./filelist
        ls
        exit
EOC

        #download files
        cadaver $URL <<EOA
        `while read p; do
        echo "get $p"
        done < ./filelist`
        exit
        cd ..
EOA

        tar cfvz /home/davcalbkp/calendar-$NAME`date +%Y.%m`.tar.gz /tmp/calendar/


done



rm -r /tmp/calendar

Entschuldigt nochmal den (vielleicht auch nicht) unnötigen Thread

Gruß

Wes

Antworten |