2009-02-21 16 views
6

W skrypcie bash muszę sprawdzić istnienie kilku plików.Bash: Jak sprawdzić, czy istnieją pewne pliki?

wiem niezgrabny sposób, aby zrobić to, co jest w następujący sposób, ale oznaczałoby to, że mój główny program musi być w tym brzydkim zagnieżdżonej strukturze:

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

Poniższa wersja nie działa:

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

drukuje

NOT FOUND 
OK 

Czy istnieje elegancki sposób zrobić to prawo?

AKTUALIZACJA: Zobacz zaakceptowaną odpowiedź. Ponadto, pod względem elegancji Lubię 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" 

Odpowiedz

10

Jak o

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

# do stuff 
echo OK 

Zobacz help [[ i help test dla opcji użytkowych z badań typu [[. Przeczytaj także this faq entry.

Twoja wersja nie działa, ponieważ (...) spawns nową pod-powłokę, w której wykonywany jest exit. W związku z tym wpływa tylko na tę podpowłokę, ale nie na skrypt wykonawczy.

Wykonuje następujące czynności, wykonując polecenia między {...} w bieżącej powłoce.

Należy również zauważyć, że należy zacytować obie zmienne, aby upewnić się, że nie ma niepożądanych rozszerzeń lub dzielenia wyrazów (muszą one zostać przekazane jako jeden argument do [).

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

Dzięki, że wygląda dobrze. Właśnie "lub" (||) powinno być "i" (&&), jak sądzę. – Frank

+0

naprawiono już :) trudne z logiką wieczorem :) –

4

myślę szukasz:

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

Zobacz man test więcej szczegółów na temat tego, co można umieścić wewnątrz [ ].

+0

+1 dla "testu man". Dzięki! – binarybob

3

Można wyświetlić listę plików i sprawdzić je w pętli:

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

do_main_stuff 
1

Zwykle używam wariant:

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" 

Nie ma zwłaszcza cnota w dokonaniu skrypt mieć pojedynczy zjazd point - nie szkodzi, ale fatalne błędy mogą równie dobrze zakończyć scenariusz.

Jedynym punktem dyskusji będzie to, czy zdiagnozować jak najwięcej problemów, jak to możliwe, przed wyjściem, czy po prostu zdiagnozować pierwszy. Średnio diagnozowanie pierwszego jest o wiele łatwiejsze.

Powiązane problemy