Test [ -r Datei ] klappt nicht

dissent

Well-Known Member
kann mir einer sagen warum diese blöden -r tests nicht funktionieren?

Egal ob Dateien da sind oder nicht, das Script läuft weiter.

jedesmal wenn ich das Script ohne Parameter starte mein der Test das wäre ne Datei...

"" sind doch keine leesbaren Dateien oder doch?
aufruf erfolgt mit

script.sh `find *.dump`

Code:
#!/bin/sh
#run delDumps.sh
log=/opt/sybase/CMD/log/dmptest.log
date >> $log
echo ueberprüfe ob zwei Dumps vorhanden sind >> $log
if [ -r $2 ]
then
        if [ -r $1 ]
        then
                if [ $1 -nt $2 ]
                then
                        echo aelterer Dump wird geloescht >> $log
                        rm $2 >> $log
                        echo aelterer Dump $2 geloescht >> $log
                else
                        if [ $2 -nt $1 ]
                        then
                                echo aelterer Dump wird geloescht >> $log
                                rm $1 >> $log
                                echo aelterer Dump $1 geloescht >> $log
                        else
                                echo !!!! Fehler !!!! >> $log
                                echo kein Dump vorhanden >> $log
                                echo !!!!!!!!!!!!!!!! >> $log
                        fi
                                echo rufe delTrans.sh auf >> $log
                                ./delTrans.sh `find *.tran`

                fi
        else
                echo FEHLER keine gueltige Dump Datei $1 >> $log
        fi
else
        echo FEHLER keine gueltige Dump Datei $2 >> $log
fi
 
Manchmal hilft's, wenn man bei den Tests "$1" statt nur $1 schreibt.

[Achtung: Eine Antwort von jemandem, der nur sehr beschränkte Shellscript-Kenntnisse bsitzt ;) ]
 
Natürlich "$1"

Ansonsten ist die Verschachtelung schon ganz schön wüst ;-)
Könnte man sicher bisschen aufdröseln.

ich würde mir auch mit einer Log-»Funktion« für die Übersicht behelfen.

Code:
LOG=/ich/bin/log/file
log() 
{
    echo "$1" >> "$LOG"
}

log "Eine Logzeile"

Aber das nur am Rande ;-)
 
Zuletzt bearbeitet von einem Moderator:
script.sh `find *.dump`
(das ist auf jeden Fall nicht *BSD)

Finde ich bisschen Merkwürdig, auch wenn das nicht Deine Frage ist.
Wer sagt das Find genau 2 ergebnisse liefert, was ist wenn find Dateinamen liefert mit Leerzeichen drinnen?

test.sh
Code:
echo "$1"
echo "$2"

Code:
> touch "foo bar" && sh test.sh `find . -name "foo*"`
./foo
bar
 
dissent schrieb:
"" sind doch keine leesbaren Dateien oder doch?

Nein, wenn test auf "" stoßen würde, würde er dir sagen, dass die Datei nicht gelesen werden kann (es sei denn du hast eine Datei mit leerem Namen, die du nicht lesen kannst :ugly:).

Wenn du aber dein Skript ohne Argumente aufrufst, werden $1 und $2 keinesfalls mit leeren Zeichenketten ersetzt sondern fallen ganz weg! Der Aufruf wird dann wie folgt aussehen:

Code:
if [ -r ]
then
...
fi

Zumindest unter OpenBSD wird dir ein Aufruf wie "test -r" 0 zurückgeben (so als ob ich eine reale Datei vor mir hätte, die ich lesen kann). Das wiederum heißt, dass dein Skript innerhalb des if-Blocks weiterverarbeitet wird.

Lösung dafür wurde ja schon genannt: Anführungszeichen verwenden.

paefchen schrieb:
Wer sagt das Find genau 2 ergebnisse liefert, was ist wenn find Dateinamen liefert mit Leerzeichen drinnen?

Das Skript namens skript.sh:
Code:
#!/bin/sh

if [ $# -ne 2 ]
then
        echo "Ich brauche zwei Argumente"
        exit
fi

echo "Anzahl Argumente: $#"
echo "Parameterliste: $@"

Beispiel:
Code:
$ touch "a b.dump"
$ touch "a c.dump"
$ find . -name "a " -print0 | xargs -0 skript.sh
Anzahl Argumente: 2
Parameterliste: ./a b.dump ./a c.dump
$ touch "a d.dump"
$ find . -name "a*" -print0 | xargs -0 skript.sh
Ich brauche zwei Argumente
 
Zurück
Oben