2014-10-08 59 views
0

我有以下for循環在我寫的小shell腳本。for循環尋找更多的文件比它應該

for file in /home/place/incoming/MYSQLIST_*.zip 
do 
    name=`echo $file|awk -F "MYSQLIST_" {'print$2'}` #get type 
    name=`echo $name|awk -F ".zip" {'print$1'}` #remove extension 

    unzip -Co ${file} -d /home/place/incoming/ 

    name=`echo type_${name}` 
    echo $name >> collect.txt 
    directory=`echo /home/place/incoming/${name}.csv` 
    echo $directory >> collect.txt 

    #cleanup 
    rm ${name}.csv 
    rm phpvars.txt 
    mv ${file} ${file}.DONE 
done 
echo Done 

該腳本大部分時間都按預期工作。我有到達此目錄的文件,格式爲MYSQLIST _ ####。zip和MYSQL _ ########。zip正如我們所期望的那樣,此腳本應忽略名爲MYSQL _ ##的文件######。壓縮。我注意到的是,for循環已經提取了全名MYSQL _ ########。zip並將其寫入collect.txt。

通常我collect.txt會在它下面:

type_21345

/home/place/incoming/type_12345.csv

然而

在少數情況下,這是在發現在collect.txt:

MYSQL_12345678

/home/place/incoming/MYSQL_12345678.csv

是否有可能在我的for循環之前丟失了一個catch,或者我應該在循環中有一個來檢查文件的名稱是否真的應該是(MYSQLIST _ * .ZIP)?

我不是在尋找像「給我代碼」這樣的答案,我想知道是否有其他人看到類似的東西(循環行爲不當)或錯誤檢查指導。

+1

'名稱= $(回聲類型_ $ {名稱})'被更有效地寫入'名=類型_ $ {名稱}'。 – chepner 2014-10-10 13:50:18

+1

我也推薦'name = $ {file ## * MYSQLIST_}'和'name = $ {name%.zip}'而不是使用'awk'來處理文件名。 – chepner 2014-10-10 13:55:00

回答

0

如果文件名中有空格或元字符,您可能希望在變量周圍添加引號。即

name=`echo $name ....` 

應該是

name=`echo "$name" ....`