shell 判斷文件是否為空,最直接的方法是使用 -s 文件測(cè)試操作符。
判斷文件為空,聽(tīng)起來(lái)簡(jiǎn)單,但實(shí)際操作中可能會(huì)遇到一些棘手的情況。我曾經(jīng)就因?yàn)楹雎粤艘粋€(gè)細(xì)節(jié),導(dǎo)致腳本運(yùn)行錯(cuò)誤,浪費(fèi)了大量時(shí)間調(diào)試。那次,我需要處理大量的日志文件,其中一些文件可能為空。我的初始腳本直接使用了 -s 操作符,然而,我忽略了文件權(quán)限的問(wèn)題。一些日志文件由于權(quán)限設(shè)置問(wèn)題,我的腳本無(wú)法訪問(wèn),導(dǎo)致 -s 操作符返回錯(cuò)誤的結(jié)果,讓我誤判了文件是否為空。
正確的做法,應(yīng)該在使用 -s 之前,先檢查文件是否存在且具有可讀權(quán)限。 我們可以結(jié)合 -f (判斷是否為普通文件) 和 -r (判斷是否可讀) 操作符來(lái)完善判斷邏輯。 例如:
if [ -f "$filename" ] && [ -r "$filename" ] && [ ! -s "$filename" ]; then echo "文件 '$filename' 為空" else echo "文件 '$filename' 不為空或無(wú)法訪問(wèn)" fi
登錄后復(fù)制
這段代碼首先檢查文件是否存在 (-f),接著檢查文件是否可讀 (-r),只有滿(mǎn)足這兩個(gè)條件,才會(huì)使用 -s 判斷文件是否為空 (! -s 表示文件大小不為零)。 這避免了因權(quán)限問(wèn)題導(dǎo)致的錯(cuò)誤判斷。 $filename 應(yīng)該替換成你的文件名變量。
另一個(gè)需要注意的點(diǎn)是,空文件和不存在的文件是不同的。 -s 操作符只針對(duì)存在的文件,如果文件不存在,它不會(huì)報(bào)錯(cuò),而是返回一個(gè)非零值,這可能被誤認(rèn)為是文件不為空。 因此,-f 的檢查至關(guān)重要。
再舉個(gè)例子,假設(shè)你正在處理一個(gè)包含多個(gè)文件的目錄,你需要找出其中所有空文件并刪除它們。 你可以使用一個(gè)循環(huán)結(jié)合上述的判斷邏輯:
find . -type f -print0 | while IFS= read -r -d $'\0' filename; do if [ -f "$filename" ] && [ -r "$filename" ] && [ ! -s "$filename" ]; then echo "刪除空文件: $filename" rm "$filename" fi done
登錄后復(fù)制
這段代碼利用 find 命令查找所有普通文件 (-type f),并使用 -print0 安全地處理文件名中可能包含空格或特殊字符的情況。 while 循環(huán)逐個(gè)處理找到的文件,并應(yīng)用我們前面討論過(guò)的邏輯進(jìn)行判斷和刪除。 -d $’\0′ 指定空字符作為分隔符,保證了腳本的健壯性。
總而言之,看似簡(jiǎn)單的判斷文件為空,實(shí)際上需要考慮文件是否存在、權(quán)限是否足夠等多種因素。 只有全面考慮這些細(xì)節(jié),才能編寫(xiě)出可靠、健壯的 Shell 腳本。 記住,良好的錯(cuò)誤處理和健壯的代碼,才能避免不必要的麻煩。
路由網(wǎng)(www.lu-you.com)您可以查閱其它相關(guān)文章!