[gelöst] Problem mit Shell-Skript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Feuernatter
Beiträge: 6
Registriert: 29.09.2014 09:43:41

[gelöst] Problem mit Shell-Skript

Beitrag von Feuernatter » 29.09.2014 10:07:21

Hallo,

ich bin von einem Cent-OS umgestiegen auf ein Debian-System in der Version "Debian 3.2.60-1+deb7u1"

Zur Datensicherung verwende ich ein Shell-Skript, welches mit die Daten bzw. Verzeichnisse in /home/www in ein Datensicherungsverzeichnis kopiert und anschließend komprimiert.
Ebenso verfährt das Skript mit den SQL- und MariaDB-Datenbanken. Jeder Unterordner im Datensicherungsverzeichnis bekommt das Datum und die Uhrzeit der durchgelaufenen Sicherung.
Nun zum Problem:

Ich hätte gerne, dass ich über eine Variable "MAX_BACKUP_FILES" die maximale Anzahl vorzuhaltender Backupverzeichnisse festlegen kann.
Im Endeffekt soll das Skript prüfen, wie viele Sicherungsverzeichnisse vorhanden sind. Die Anzahl wird von "MAX_BACKUP_FILES" abgezogen. Ist das Ergebnis der Berechnung "0" so wird ein Ordner gelöscht.
In der Shell erhalte ich aber folgende Fehlermeldung:

backup.sh: 44: backup.sh: [[: not found

Mein Skript sieht "auszugsweise" so aus:

Code: Alles auswählen


## Anzahl der aufzubewahrenden Backup-Versionen
MAX_BACKUP_FILES=30

#################################################################################################################################
## Alte Datensicherungen loeschen
#################################################################################################################################
cd ${backup_org_www}
countfolders=$(ls -1 | wc -l)
clearfolders=$((countfolders-MAX_BACKUP_FILES))
counter=0
if [[ "clearfolders" -gt 0 ]]; then
    for folder in *
    do  
        if [[ "$counter" -lt "clearfolders" ]]; then
            rm -rf ${backup_mariadb}/${folder}
            rm -rf ${backup_mysql}/${folder}
            rm -rf ${backup_org_www}/${folder}
            rm -rf ${backup_owncloud}/${folder}
            
        else
            break
        fi
        counter=$((counter+1))
    done
fi
Wo liegt mein Fehler?

Grüße
Feuernatter
Zuletzt geändert von Feuernatter am 29.09.2014 11:32:23, insgesamt 1-mal geändert.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Problem mit Shell-Skript

Beitrag von Liffi » 29.09.2014 10:18:28

Reicht da nicht '[' statt '[['?

EDIT::

Code: Alles auswählen

"clearfolders" -gt 0
macht möglicherweise auch was anderes als du denkst. Ohne es jetzt zu überprüfen würde ich denken, der String clearfolders wird mit einer Zahl verglichen.

Feuernatter
Beiträge: 6
Registriert: 29.09.2014 09:43:41

Re: Problem mit Shell-Skript

Beitrag von Feuernatter » 29.09.2014 10:44:46

Hallo Liffi,

so war es auch gedacht ...
Ich habe deinen Ansatz getestet und das Skript wie folgt angepasst:

Code: Alles auswählen

if  [ "clearfolders" -gt 0]; then
Leider aber hat sich das Fehlermuster geändert.

Meldung:
backup.sh: 44: [: missing ]

Ich bin ziemlich ratlos

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Problem mit Shell-Skript

Beitrag von Liffi » 29.09.2014 10:48:50

' ]' vs ']'.

Benutzeravatar
whisper
Beiträge: 3378
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Problem mit Shell-Skript

Beitrag von whisper » 29.09.2014 10:50:52

Hast du bash installiert?
Wenn ja, dann sorge mit #!/bin/bash dafür, das du auch die bash benutzt.
Sonst ist es evtl. dash, welche manchmal Unterschiede zur bash zeigt, die schwer zu lokalisieren sind.
Ach ja und IMMER ! Leerzeichen vor und hinter einer ] und [
Alter ist übrigens keine Ausrede, nur Erfahrung, die sich stapelt. 😉

Feuernatter
Beiträge: 6
Registriert: 29.09.2014 09:43:41

Re: Problem mit Shell-Skript

Beitrag von Feuernatter » 29.09.2014 11:02:29

@whisper

Ich hatte #!/bin/sh benutzt, bei #!/bin/bash bleibt der Fehler gleich

@all

bei

Code: Alles auswählen

if [ "clearfolders" -gt 0 ] ] ; then
gibt es die Meldung:

backup.sh: 44: [: Illegal number: clearfolders

Benutzeravatar
habakug
Moderator
Beiträge: 4314
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: Problem mit Shell-Skript

Beitrag von habakug » 29.09.2014 11:12:51

Hallo!

Schon mal so probiert:

Code: Alles auswählen

if [ $clearfolders -gt 0 ] ] ; then
?

Gruss, habakug

(Das gilt für all "clearfolders" ;-))
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

Feuernatter
Beiträge: 6
Registriert: 29.09.2014 09:43:41

Re: Problem mit Shell-Skript

Beitrag von Feuernatter » 29.09.2014 11:15:55

@ habakug

Ich habe es direkt umgesetzt

Code: Alles auswählen

cd ${backup_org_www}
countfolders=$(ls -1 | wc -l)
clearfolders=$((countfolders-MAX_BACKUP_FILES))
counter=0
if [ $clearfolders -gt 0 ] ] ; then
   for folder in *
   do
        if [[ "$counter" -lt "clearfolders" ]]; then
            rm -rf ${backup_mariadb}/${folder}
            rm -rf ${backup_mysql}/${folder}
            rm -rf ${backup_org_www}/${folder}
            rm -rf ${backup_owncloud}/${folder}

        else
            break
        fi
        counter=$((counter+1))
    done
fi
Die Fehlermeldung lautet nun:
backup.sh: 44: [: 0: unexpected operator

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Problem mit Shell-Skript

Beitrag von Liffi » 29.09.2014 11:16:30

habakug hat geschrieben: Schon mal so probiert:

Code: Alles auswählen

if [ $clearfolders -gt 0 ] ] ; then
?
Wozu dient die zweite ']'?

@Feuernatter: Ein paar Zeilen später sind übrigens wieder die gleichen Probleme zu erwarten.

EDIT:: Bash und ZSH können mit '[[' und ']]' umgehen, dash nicht.
Zuletzt geändert von Liffi am 29.09.2014 11:25:34, insgesamt 1-mal geändert.

Feuernatter
Beiträge: 6
Registriert: 29.09.2014 09:43:41

Re: Problem mit Shell-Skript

Beitrag von Feuernatter » 29.09.2014 11:25:28

So, neuer Versuch ...
Ich habe das Skript nun folgendermaßen angepasst:

Code: Alles auswählen

cd ${backup_org_www}
countfolders=$(ls -1 | wc -l)
clearfolders=$((countfolders-MAX_BACKUP_FILES))
counter=0
if [ $clearfolders -gt 0 ] ; then
   for folder in *
   do
        if [ "$counter" -lt $clearfolders ] ; then
            rm -rf ${backup_mariadb}/${folder}
            rm -rf ${backup_mysql}/${folder}
            rm -rf ${backup_org_www}/${folder}
            rm -rf ${backup_owncloud}/${folder}

        else
            break
        fi
        counter=$((counter+1))
    done
fi
Es funktioniert nun - da stand bei mir einer auf "der Leitung".

Interessant ist nun, dass das Skript die Vorgabe MAX_BACKUP_FILES zwar einhält, aber immer MAX_BACKUP_FILES + 1 im Verzeichnis belässt.

Liffi
Beiträge: 2345
Registriert: 02.10.2004 01:33:05

Re: Problem mit Shell-Skript

Beitrag von Liffi » 29.09.2014 11:28:44

http://mywiki.wooledge.org/BashFAQ/031 gibt einen guten Einblick, wie/wann man doppelte statt einfache eckige Klammern einsetzt.

Feuernatter
Beiträge: 6
Registriert: 29.09.2014 09:43:41

Re: Problem mit Shell-Skript

Beitrag von Feuernatter » 29.09.2014 11:32:01

Super :-)

Vielen, vielen Dank für die Hilfe.
Meine Shell-Skript-Kenntnisse sind eher rudimentär, deshalb bitte ich darum, meine "lange Leitung" zu entschuldigen.
Ich gelobe aber Besserung und werde mir den Link mit Interesse zu Gemüte führen.

Nochmals vielen Dank für die kompetente Hilfe.

Grüße
Feuernatter

Benutzeravatar
habakug
Moderator
Beiträge: 4314
Registriert: 23.10.2004 13:08:41
Lizenz eigener Beiträge: MIT Lizenz

Re: [gelöst] Problem mit Shell-Skript

Beitrag von habakug » 29.09.2014 11:37:20

Hallo!

Ich hatte einfach aus seinem Posting kopiert. Die zweite Klammer war Unsinn. Ich wollte nur die Bennenung der Variable richtigstellen. Sorry für den Rest.

Gruss, habakug
( # = root | $ = user | !! = mod ) (Vor der PN) (Debianforum-Wiki) (NoPaste)

Antworten