2015-09-03 39 views
0

我在執行數組的代碼和if語句塊有問題,以檢查文件是否處於活動狀態。爲了進行調試,我使用-x運行腳本,並且在比較[ … ]中的兩個值時缺少該值。我已經通過搜索網站的數量來找到答案,但一直沒有能夠這樣做。如果該文件處於活動使用狀態或未被使用,將會刪除哪些內容,以便對比該塊的問題或修復情況?Bash - 如果語句沒有提取值

#!/bin/bash 
#---- parameters check----# 
if ([ "$2" -le "0" ]) 
then 
    echo 'Invalid number of days...' 
    echo '' 
    echo 'The number of days must be greater then 0' 
    exit 1; 
fi 

#----variables----# 
Days="$2" 
timestamp=$(date +%Y%m%d_%H%M%S) 
FILEFOLDER="$1" 
logfile=~/"log_purge_$timestamp.txt" 

#----foldercheck----# 
if [ -d $FILEFOLDER ] 
then 
    echo "File Folder Directory $FILEFOLDER is set." | tee "$logfile" 
else 
    echo "File Folder Directory $FILEFOLDER does not exist! Process will 
Exit." 
    exit 1; 
fi 

#----Find if the file is In Use through Array and IF---# 

files_check=($(find "$FILEFOLDER" -type f -mtime +"$Days" -print)) 

for f_c in "${files_check[@]}" 
do 
    if [ "${f_c}" == "$(lsof | grep "$f_c")" ] 
    then 
    echo "$f_c is in use rite now,quiting the process" 
    exit 1 
fi 
done 

echo "No file is in Use right now. Safe to remove" 

#---Total Number of Files & Purge ---# 
files_num=$(find "$FILEFOLDER" -type f -mtime +"$Days" | wc -l) 

echo "Total number of files" $files_num | tee -a "$logfile" 

find "$FILEFOLDER" -type f -mtime +"$Days" -print | sed "s|$FILEFOLDER||g" | tee -a $logfile 

echo "Purging the files now ....." 

find "$FILEFOLDER" -type f -mtime +"$Days" -exec rm {} \;` 
+2

刪除'(「'''''$ 2」-le「0」]'' – BroSlow

+0

''''如果[cond1(exp)cond2] ??? – iking15

+1

我想這裏可能並不重要,它只會運行在一個應該返回測試結果的子shell中。但一般情況是,只要執行'[$ 2 -le 0]'或'(($ 2 <0))' – BroSlow

回答

1

在我的機器,lsof生產線,如

LookupVie 75408 jleffler 14r  REG    1,4  129990 1353198 /System/Library/CoreServices/SystemAppearance.bundle/Contents/Resources/AccessibilityVibrantLightAppearance.car 

,這顯然是不相同的文件名,所以平等是行不通的。您可能會用grep -o(只輸出匹配的文字)。即使如此,如果兩個或多個進程打開相同的文件,您將獲得多行匹配輸出,因此您不會相同。你真的要檢查其狀態是否從發現grep文件:

if lsof | grep -q -e "$f_c" 
then … 
fi 

你殘留的問題是,你正在檢查的文件名是否都不能包含空格或換行等,或名稱是否與您檢查可以被嵌入作爲另一個名字的一部分。在這種情況下,你需要一個更復雜的正則表達式(也許是在結尾處增加一美元一樣簡單和手之間有一個空格):

if lsof | grep -q -e "[[:space:]]$f_c$" 

在名稱中的空格或換行符會搞亂使用file_check=($(find …))

另外,lsof相當昂貴。您可能會更好地運行一次並捕獲結果。您無論如何都面臨TOCTOU(檢查時間,使用時間)問題 - 文件在腳本查看時可能未被使用,但現在可能正在使用,反之亦然(文件在檢查時正在使用,但該文件不再使用)。

+0

那麼最好的方法是通過bash檢查這個腳本文件是否在USE中? – iking15

+0

'tmp = $(mktemp「$ {TMPDIR: -/tmp} /litmus.XXXXXX」);陷阱「rm -f'$ tmp'; exit 1」0 1 2 3 13 15;在循環之前使用lsof>「$ tmp」;那麼'if grep -q -e「$ f_c」$ tmp;然後...使用的文件...; fi',最後是'rm -f「$ tmp」;陷阱0'刪除臨時文件併成功退出。由於第一個「陷阱」,以前的退出將報告退出狀態爲1,失敗。所有這些都是用於強大編程的標準shell腳本。如果您不喜歡使用'/ tmp',那麼您可以使用臨時文件的位置 - 創建一個受保護的子目錄並將文件置於其中或其他方式。 –