PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [bash] Mehrfaches else in if-Abfrage



bla!zilla
05-11-2006, 15:11
Hallo,

kurze Frage, ich habe ein totales Brett vor dem Kopf:



# Prüfen ob eine Option übergeben wurde
if [ -d $1 ];
then echo "Option erkannt. Sichere Verzeichnis $1" >> $LOGFILE;
else
if [ -r $1 ]
then echo "Option erkannt. Sichere Datei $1" >> $LOGFILE;
fi
else
if [ "$1" = "" ]
then echo "Keine Option übergeben, sichere $BCKUPDIR" >> $LOGFILE;
fi
fi


Diese if-Abfrage endet in einem:



patrick@starcat:~> backup-home
/home/patrick/bin/backup-home: line 36: syntax error near unexpected token `else'
/home/patrick/bin/backup-home: line 36: ` else'


Der Fehler liegt also in der zweiten else-Klausel. Aber warum? Kommentiere ich die aus, geht alles, ich brauche sie aber.

Danke für eure Hilfe.

peschmae
05-11-2006, 15:39
Hi, dass das so nicht geht ist recht klar. Du hast hier zwei elses die beide zum ersten if gehören. Wie soll er da wissen welches davon?
Vermutlich war dir nicht bewusst dass es dazu in bash das elif gibt statt dem "else if"?

Die Frage ist nur was du eigentlich genau willst.

Ich gehe mal von einem

if () {
}
else if () {
}
else if () {
}


aus - dann sieht das in Bash so aus:



if [ -d $1 ]; then
echo "Option erkannt. Sichere Verzeichnis $1" >> $LOGFILE;
elif [ -r $1 ]; then
echo "Option erkannt. Sichere Datei $1" >> $LOGFILE;
elif [ "$1" = "" ]; then
echo "Keine Option übergeben, sichere $BCKUPDIR" >> $LOGFILE;
fi


oder möchtest du die etwa schachteln? Dann brauchst du tatsächlich die mehreren fis und so.

MfG Peschmä

bla!zilla
05-11-2006, 16:05
Hi, dass das so nicht geht ist recht klar. Du hast hier zwei elses die beide zum ersten if gehören. Wie soll er da wissen welches davon?
Vermutlich war dir nicht bewusst dass es dazu in bash das elif gibt statt dem "else if"?


Korrekt. Aber so betracht brutal logisch.



aus - dann sieht das in Bash so aus:



if [ -d $1 ]; then
echo "Option erkannt. Sichere Verzeichnis $1" >> $LOGFILE;
elif [ -r $1 ]; then
echo "Option erkannt. Sichere Datei $1" >> $LOGFILE;
elif [ "$1" = "" ]; then
echo "Keine Option übergeben, sichere $BCKUPDIR" >> $LOGFILE;
fi



Okay.



oder möchtest du die etwa schachteln? Dann brauchst du tatsächlich die mehreren fis und so.


Nein, eigentlich will ich nicht schachteln. Ich will nur, je nach Art von $1, eine andere else-Klausel verwenden. Sieht nun so aus (das echo statt tar dient zu Debugzwecken).




# Prüfen ob eine Option übergeben wurde
if [ -d $1 ]; then
echo "Option erkannt. Sichere Verzeichnis $1" >> $LOGFILE
BCKFILE=`echo $1 | sed 's/\//-/g'`
echo -czf $BCKFILE-`date +%F`.tgz
elif [ -r $1 ]; then
echo "Option erkannt. Sichere Datei $1" >> $LOGFILE
BCKFILE=`echo $1 | sed 's/\//-/g'`
echo -czf $BCKFILE-`date +%F`.tgz
elif [ "$1" = "" ]; then
echo "Keine Option übergeben, sichere $HOME" >> $LOGFILE
BCKFILE=`echo $HOME | sed 's/\//-/g'`
echo -czf $BCKFILE-`date +%F`.tgz
fi


Die letzte elif greift (noch) nicht. Mal gucken warum.

Danke für deine Hilfe.

anda_skoa
05-11-2006, 17:49
Du kannst das letzte elif auch probeweise so schreiben



elif [ -z "$1" ];


Ciao,
_

bla!zilla
05-11-2006, 18:08
Hi,

danke für den Hinweis. Diesen Weg habe ich in der Zwischenzeit auch gefunden. Man-Pages lesen bildet. :) Trotzdem dank - fühle mich bestätigt. ;)