ubuntuusers.de

shell script: Syntax error: word unexpected (expecting "do")

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

muku1

Anmeldungsdatum:
1. Juni 2012

Beiträge: 19

Hallo zusammen,

leider habe ich ein Problem bei meinen Script. Ich bekomme folgende Fehlermeldung: Syntax error: word unexpected (expecting "do")

Hier der Betroffene Teil:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
for database in $DBS; do
    SCHEMA=$DIR/$database.schema.gz
    DATA=$DIR/$database.data.gz

    # export data from postgres databases to plain text
    $PGDUMP -C -c -s $database | gzip -9 > $SCHEMA

    # dump data
    $PGDUMP -a $database | gzip -9 > $DATA
done

Ich hoffe ihr könnt mir helfen.

Mfg muku

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21852

Wohnort: Lorchhausen im schönen Rheingau

Entweder du schreibst

1
for thing in $things; do

oder

1
2
for thing in $things 
do

muku1

(Themenstarter)

Anmeldungsdatum:
1. Juni 2012

Beiträge: 19

redknight schrieb:

Entweder du schreibst

1
for thing in $things; do

oder

1
2
for thing in $things 
do

Danke für deine Antwort. Schon probiert aber leider erhalte ich weiterhin die gleiche Fehlermeldung. Hast du vielleicht noch eine Idee?

Mfg muku

//edit: Ich habs oben im Code korregiert!

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21852

Wohnort: Lorchhausen im schönen Rheingau

Kommt drauf an, was in $DBS steht. Kann da evtl ein Semikolon vorkommen?

muku1

(Themenstarter)

Anmeldungsdatum:
1. Juni 2012

Beiträge: 19

redknight schrieb:

Kommt drauf an, was in $DBS steht. Kann da evtl ein Semikolon vorkommen?

Hallo,

nein es steht kein semikolon in $DBS !

Hier mal zur Vervollständigung das Ganze Script: Ich hoffe du findest das Problem 🙄

 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
#!/bin/sh

DUMPALL="/usr/bin/pg_dumpall"
PGDUMP="/usr/bin/pg_dump"
PSQL="/usr/bin/psql"

# directory to save backups in, must be rwx for user postgres
BASE_DIR="/opt/path/"
YMD=$(date "+%Y-%m-%d")
DIR="$BASE_DIR/$YMD"
mkdir -p $DIR
cd $DIR

# list of databases
DBS=$($PSQL -l -t | egrep -i 'db_t|db_l' | awk '{print $1}'

# first dump entire postgres database, including pg_shadow etc.
$DUMPALL -D | gzip -9 > "$DIR/db.out.gz"

# Dump only global objects (roles and tablespaces), no databases
$DUMPALL -g | gzip -9 > "$DIR/globals.gz"

# now loop through each individual database and backup the schema and data separately
for database in $DBS; do
    SCHEMA=$DIR/$database.schema.gz
    DATA=$DIR/$database.data.gz

    # export data from postgres databases to plain text
    $PGDUMP -C -c -s $database | gzip -9 > $SCHEMA

    # dump data
    $PGDUMP -a $database | gzip -9 > $DATA
done

# delete backup files older than 30 days
# find search for files in a directory hierarchy
# -type d = character (unbuffered) special
OLD=$(find $BASE_DIR -type d -mtime +30)
if [ -n "$OLD" ] ; then
        echo deleting old backup files: $OLD
        echo $OLD | xargs rm -rfv
fi

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21852

Wohnort: Lorchhausen im schönen Rheingau

hihi, Zeilenumbrüche in variablen sind aber nicht schön.

1
for database in ${DBS[@]}; do

sollte es sein. Bevor du loslegst, teste deine Befehle erst mit echo, ob da valide ausgaben kommen 😉

muku1

(Themenstarter)

Anmeldungsdatum:
1. Juni 2012

Beiträge: 19

redknight schrieb:

hihi, Zeilenumbrüche in variablen sind aber nicht schön.

1
for database in ${DBS[@]}; do

sollte es sein. Bevor du loslegst, teste deine Befehle erst mit echo, ob da valide ausgaben kommen 😉

Danke für deine Antwort, wie genau hast du dir das mit echo vorgestellt? Ich hab versucht das Script mit folgendem Befehl zu prüfen:

1
sh -n /pfad/scriptname.sh

PS: Auch das Ändern wie in deinem deinem Vorschlag, brachte kein positives Ergebnis. Weiterhin gleiche Fehlermeldung.

Gruß muku

amilaggin

Anmeldungsdatum:
7. Juni 2012

Beiträge: 156

Fehlt da nicht etwas am Ende in Zeile 15?

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21852

Wohnort: Lorchhausen im schönen Rheingau

amilaggin schrieb:

Fehlt da nicht etwas am Ende in Zeile 15?

Guter Punkt, hab ich übersehen 😉 Da fehlt in der tat die schließende Klammer.

muku1 schrieb:

Danke für deine Antwort, wie genau hast du dir das mit echo vorgestellt?

Mach aus

SCHEMA=$DIR/$database.schema.gz

ein

echo "SCHEMA=$DIR/$database.schema.gz"

zB, um sicherzugehen, dass die Ausgaben rauskommen, die du gerne ausführen willst.

PS: Auch das Ändern wie in deinem deinem Vorschlag, brachte kein positives Ergebnis. Weiterhin gleiche Fehlermeldung.

Dann solltest Du zum Beispiel mal prüfen, was Zeile15 überhaupt ausgibt, also ohne es in eine Variable zu schreiben.

muku1

(Themenstarter)

Anmeldungsdatum:
1. Juni 2012

Beiträge: 19

amilaggin schrieb:

Fehlt da nicht etwas am Ende in Zeile 15?

Hallo amilaggin, vollög richtig, da fehlt die zu schließende Klammer. Aber leider weiterhin gleiche Fehlermeldung ☹

muku1

(Themenstarter)

Anmeldungsdatum:
1. Juni 2012

Beiträge: 19

redknight schrieb:

amilaggin schrieb:

Fehlt da nicht etwas am Ende in Zeile 15?

Guter Punkt, hab ich übersehen 😉 Da fehlt in der tat die schließende Klammer.

muku1 schrieb:

Danke für deine Antwort, wie genau hast du dir das mit echo vorgestellt?

Mach aus

SCHEMA=$DIR/$database.schema.gz

ein

echo "SCHEMA=$DIR/$database.schema.gz"

zB, um sicherzugehen, dass die Ausgaben rauskommen, die du gerne ausführen willst.

PS: Auch das Ändern wie in deinem deinem Vorschlag, brachte kein positives Ergebnis. Weiterhin gleiche Fehlermeldung.

Dann solltest Du zum Beispiel mal prüfen, was Zeile15 überhaupt ausgibt, also ohne es in eine Variable zu schreiben.

Also Zeile 15 gibt definiv was aus, nämlich die zu sicherenden Datenbanken (getestet).

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21852

Wohnort: Lorchhausen im schönen Rheingau

muku1 schrieb:

Also Zeile 15 gibt definiv was aus, nämlich die zu sicherenden Datenbanken (getestet).

Und in welcher Form? Bitte lass dir nicht jede klitzekleine Information aus den Fingern ziehen

muku1

(Themenstarter)

Anmeldungsdatum:
1. Juni 2012

Beiträge: 19

redknight schrieb:

muku1 schrieb:

Also Zeile 15 gibt definiv was aus, nämlich die zu sicherenden Datenbanken (getestet).

Und in welcher Form? Bitte lass dir nicht jede klitzekleine Information aus den Fingern ziehen

Sorry, also bei Eingabe von

1
sudo -u postgres psql -l -t | egrep -i 'dma_test|dma_live' | awk '{print $1}'

bekomme folgende Ausgabe:

1
2
3
[sudo] password for ksroot:
could not change directory to "/home/ksroot"
db_t

//edit: Ich hab den Fehler! Ich hatte das Script in Windows erstellt und darin lag der Fehler. Im Script waren unsichtbar zeichen (wg. der Kodierung in meinen Fall ANSI). Ich hab das Script neu in ubuntu erstellt und viele der Fehler waren verschwunden. Wie man sein Script mit vim bereinigen kann steht hier http://www.linuxquestions.org/questions/slackware-14/bin-bash%5Em-bad-interpreter-no-such-file-or-directory-461400/

Viele Grüße und danke für die Hilfe muku

Antworten |