2009-02-21 103 views
6

bash腳本中,我必須檢查是否存在多個文件。Bash:如何檢查某些文件是否存在?

我知道一個尷尬的方式做到這一點,這是如下,但是這將意味着我的主要程序必須是醜陋的嵌套結構中:

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

以下版本不起作用:

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

它打印

NOT FOUND 
OK 

有一種優雅的方式做到這一點嗎?

更新:查看接受的答案。此外,優雅的方面,我喜歡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" 

回答

10

對於如何與[[風格測試可用的選項約

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

# do stuff 
echo OK 

help [[help test。還請閱讀this faq entry

您的版本不起作用,因爲(...)會衍生出一個新的子shell,其中執行exit。因此它僅影響該子shell,但不影響執行腳本。

下面的工作代替了執行當前shell中的{...}之間的命令。

我還應該注意,你必須引用兩個變量,以確保沒有不必要的擴展或分詞(它們必須作爲一個參數傳遞給[)。

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

謝謝,這看起來不錯。只是'或'(||)應該是'和'(&&),我猜。 – Frank 2009-02-21 04:01:35

+0

已經修復:)在晚上邏輯困難:) – 2009-02-21 04:09:14

4

我認爲你正在尋找:

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

上你可以在裏面[ ]把更多的詳情,請參閱man test

3

您可以列出文件,並檢查他們在一個循環:

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

do_main_stuff 
1

我通常使用的一個變種:

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" 

沒有什麼特別的美德使得shell腳本有一個出口點 - 也沒有害處,但致命的錯誤可能會終止劇本。

唯一的爭論點是在退出前是否診斷儘可能多的問題,或者是否只是診斷第一個問題。平均而言,只診斷第一個就容易多了。