2009-02-21 7 views
6

In einem bash Skript muss ich auf das Vorhandensein mehrerer Dateien prüfen.Bash: Wie überprüfe ich, ob bestimmte Dateien existieren?

Ich kenne eine unangenehme Art und Weise, es zu tun, die wie folgt, aber das würde bedeuten, dass mein Hauptprogramm innerhalb dieser hässlichen verschachtelte Struktur zu sein hat:

if [ -f $FILE1 ] 
then 
if [ -f $FILE2 ] 
then 
    echo OK 
    # MAIN PROGRAM HERE 
fi 
fi 

Die folgende Version nicht funktioniert:

([ -f $FILE1 ] && [ -f $FILE2 ]) || (echo "NOT FOUND"; exit 1) 
echo OK 

Er druckt

NOT FOUND 
OK 

gibt es eine elegante Möglichkeit, dieses Recht zu tun?

UPDATE: Siehe die angenommene Antwort. Darüber hinaus im Hinblick auf die Eleganz mag ich Jonathan Leffler's answer:

arg0=$(basename $0 .sh) 
error() 
{ 
    echo "$arg0: [email protected]" 1>&2 
    exit 1 
} 

[ -f $FILE2 ] || error "$FILE2 not found" 
[ -f $FILE1 ] || error "$FILE1 not found" 

Antwort

10

Wie wäre es

if [[ ! (-f $FILE1 && -f $FILE2) ]]; then 
    echo NOT FOUND 
    exit 1 
fi 

# do stuff 
echo OK 

Siehe help [[ und help test für die Optionen verwendbar mit den [[ Stil Tests. Lesen Sie auch this faq entry.

Ihre Version funktioniert nicht, weil (...) eine neue Sub-Shell hervorbringt, in der die 10 ausgeführt wird. Es betrifft daher nur diese Subshell, nicht aber das ausführende Skript.

Folgendes funktioniert stattdessen, Ausführen der Befehle zwischen {...} in der aktuellen Shell.

Ich sollte auch beachten, dass Sie beide Variablen angeben müssen, um sicherzustellen, dass keine unerwünschte Erweiterung oder Worttrennung vorgenommen wird (sie müssen als ein Argument an [ übergeben werden).

[ -f "$FILE1" ] && [ -f "$FILE2" ] || { echo "NOT FOUND"; exit 1; } 
+0

Danke, das sieht gut aus. Nur das 'oder' (||) sollte ein 'und' (&&) sein, denke ich. – Frank

+0

schon behoben :) schwierig mit Logik am Abend :) –

4

Ich glaube, du bist:

if [ -f $FILE1 -a -f $FILE2 ]; then 
    echo OK 
fi 

Siehe man test, um weitere Informationen darüber, was Sie in der [ ] setzen können.

+0

+1 für 'man test'. Vielen Dank! – binarybob

3

Sie können die Dateien auflisten und sie in einer Schleife überprüfen:

file_list='file1 file2 wild*' 
for file in $file_list; do 
    [ -f $file ] || exit 
done 

do_main_stuff 
1

ich in der Regel eine Variante verwenden:

arg0=$(basename $0 .sh) 
error() 
{ 
    echo "$arg0: [email protected]" 1>&2 
    exit 1 
} 

[ -f $FILE2 ] || error "$FILE2 not found" 
[ -f $FILE1 ] || error "$FILE1 not found" 

Es gibt keine besondere Tugend das Shell-Script bei der Herstellung haben einen einzigen Ausgang Punkt - auch kein Schaden, aber fatale Fehler können ebenso das Skript beenden.

Der einzige Punkt der Debatte wäre, ob so viele Probleme wie möglich vor dem Beenden zu diagnostizieren, oder ob nur die erste zu diagnostizieren. Im Durchschnitt ist die Diagnose nur der erste viel einfacher.