2011-10-17 62 views
2

我有下面的if語句。當我在文件夾中同時存在csv文件和zip文件時,它會給我語法錯誤。但是,當我單獨使用csv文件或單獨使用zip文件或不存在文件時,它就可以工作。如果在KornShell腳本語句

我不知道下面的命令將導致語法錯誤:

if [ -f ctf_error_report_??_????????????.csv -o -f ctf_error_report_??_????????????.???.zip ]; 
then 
    echo "Successful" 
else 
    echo "Problem" 
fi 
exit 0 

對此任何瞭解?

+0

使用'ksh -x your-script'來查看執行的內容。有可能文件名擴展表達式產生多個文件名,因爲其他人在他們的答案中已經診斷出來。 –

回答

4

這是檢查文件的危險方法。如果您碰巧在該目錄中有多個匹配項,那麼它將不起作用,因爲每個文件都將成爲單獨的參數,這與參數文本的語法不匹配。一個更好的(但不是萬無一失的)的方式來做到這一點是這樣的:

set ctf_error_report_??_????????????.csv 
csv_file=$1 
set ctf_error_report_??_????????????.???.zip 
zip_file=$1 

if [ -f "$csv_file" -o -f "$zip_file" ] 
then 
    echo "Successful" 
else 
    echo "Problem" 
fi 
+0

也可以這樣說:'set ...?。csv; n_csvfiles = $#;設置...?。zip。 n_zipfiles = $#;如果[$ n_csvfiles -gt 0 -0 $ nzipfiles -gt 0]; ...' –

+1

這不起作用,因爲如果通配符模式不匹配任何內容,它將不會被替換,並且$ n_csvfiles將爲1. –

+0

非常感謝您的信息。有效。 – Arav

1

我懷疑你需要這個測試一些文件傳輸的成功或報告生成腳本(我是關?)。我會做它的方式(可能不是最好的,但它應該工作)是這樣的:

#!/bin/bash 
FILE_FOUND=0 
ls ./ctf_error_report_??_????????????.csv &>/dev/null 
if [ $? -eq 0 ]; then 
    FILE_FOUND=1 
fi 

ls ./ctf_error_report_??_????????????.???.zip &>/dev/null 
if [ $? -eq 0 ]; then 
    FILE_FOUND=1 
fi 

if [ $FILE_FOUND -eq 1 ]; then 
    echo "Successful" 
else 
    echo "Problem" 
fi 

這將返回成功的那一刻,你正在尋找一個在腳本的目錄中找到的文件模式。您可以更改./文件的完整路徑當然...

+0

非常感謝您的信息 – Arav