Linux中Shell腳本判斷文件/文件夾是否存在方法
前言
在Linux系統(tǒng)中編寫(xiě)腳本時(shí)候,常常會(huì)碰到需要判斷文件或文件夾是否存在的情況。遇到這種情況,你可以通過(guò)test命令來(lái)檢查文件是否存在,并確定文件的類(lèi)型。
test命令采用以下語(yǔ)法格式:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
如果你希望你的腳本具有很強(qiáng)的兼容性和可移植性,你可以是由舊的test命令格式[
,該命令在所有POSIX shell上都可用。大多數(shù)使用Bash、Zsh和Ksh作為默認(rèn)shell的現(xiàn)代系統(tǒng)都支持test命令[[
(雙括號(hào))的新升級(jí)版本。
01、檢查文件是否存在
當(dāng)你在shell中需要檢查一個(gè)文件是否存在時(shí),通常需要使用到文件操作符-e
和-f
。第一個(gè)-e
用來(lái)檢查文件是否存在,而不管文件類(lèi)型。第二個(gè)-f
僅僅用來(lái)檢查文件是常規(guī)文件(不是目錄或設(shè)備)時(shí)返回true。
當(dāng)檢查文件是否存在時(shí),命令中的操作選項(xiàng)通常將test命令不同格式和if語(yǔ)句結(jié)合使用。下面的示例shell代碼將檢查/etc/resolv.conf
文件是否存在。
FILE=/etc/resolv.conf if test -f "$FILE"; then echo "$FILE exist" fi
FILE=/etc/resolv.conf if [ -f "$FILE" ]; then echo "$FILE exist" fi
FILE=/etc/resolv.conf if [[ -f "$FILE" ]]; then echo "$FILE exist" fi
如果你需要通過(guò)判斷文件是否存在進(jìn)行不同的操作,只需要使用類(lèi)似如下if/then
格式語(yǔ)句即可。
FILE=/etc/resolv.conf if [ -f "$FILE" ]; then echo "$FILE exist" else echo "$FILE does not exist" fi
在處理文件名稱(chēng)中包含有空格的文件時(shí),請(qǐng)使用雙引號(hào)避免出現(xiàn)一些處理問(wèn)題。你也可以在不使用if語(yǔ)句的情況下使用test命令,只有當(dāng)test命令執(zhí)行后的結(jié)果為true時(shí),跟在test命令&&
運(yùn)算符之后的內(nèi)容才會(huì)被執(zhí)行。
示例如下:
test -f /etc/resolv.conf && echo "$FILE exist" [ -f /etc/resolv.conf ] && echo "$FILE exist" [[ -f /etc/resolv.conf ]] && echo "$FILE exist"
如果要在&&
運(yùn)算符之后運(yùn)行一系列命令,只需將命令括在用;
或&&
分隔的大括號(hào)中:
[ -f /etc/resolv.conf ] && { echo "$FILE exist"; cp "$FILE" /tmp/; }
與&&
相反,只有在test命令的exit狀態(tài)為false
時(shí),才會(huì)執(zhí)行||
運(yùn)算符后面的語(yǔ)句。
[ -f /etc/resolv.conf ] && echo "$FILE exist" || echo "$FILE does not exist"
02、檢查目錄是否存在
Linux系統(tǒng)中運(yùn)算符-d
允許你測(cè)試一個(gè)文件是否時(shí)目錄。
例如檢查/etc/docker
目錄是否存在,你可以使用如下腳本:
FILE=/etc/docker if [ -d "$FILE" ]; then echo "$FILE is a directory" fi [ -d /etc/docker ] && echo "$FILE is a directory"
如果你喜歡你也可以使用雙括號(hào)[[
代替腳本中的單括號(hào)[
。
03、檢查文件是否不存在
和其他語(yǔ)言相似,test表達(dá)式允許使用!
(感嘆號(hào))做邏輯not運(yùn)算,示例如下:
FILE=/etc/docker if [ ! -f "$FILE" ]; then echo "$FILE does not exist" fi [ ! -f /etc/docker ] && echo "$FILE does not exist"
04、檢查是否存在多個(gè)文件
不使用復(fù)雜的嵌套if/else
構(gòu)造,您可以使用-a
(或帶[[
的&&
預(yù)算符)來(lái)測(cè)試是否存在多個(gè)文件,示例如下:
if [ -f /etc/resolv.conf -a -f /etc/hosts ]; then echo "Both files exist." fi if [[ -f /etc/resolv.conf && -f /etc/hosts ]]; then echo "Both files exist." fi
以下腳本語(yǔ)句為不使用if語(yǔ)句等效語(yǔ)句:
[ -f /etc/resolv.conf -a -f /etc/hosts ] && echo "Both files exist." [[ -f /etc/resolv.conf && -f /etc/hosts ]] && echo "Both files exist."
05、文件test命令運(yùn)算符
test命令包含以下文件操作運(yùn)算符,這些運(yùn)算符允許你測(cè)試不同類(lèi)型的文件:
-b
FILE
- 如果文件存在并且是塊特殊文件,則為T(mén)rue。-c
FILE
- 如果文件存在并且是特殊字符文件,則為T(mén)rue。-d
FILE
- 如果文件存在并且是目錄,則為T(mén)rue。-e
FILE
- 如果文件存在并且是文件,則為T(mén)rue,而不考慮類(lèi)型(節(jié)點(diǎn)、目錄、套接字等)。-f
FILE
- 如果文件存在并且是常規(guī)文件(不是目錄或設(shè)備),則為T(mén)rue。-G
FILE
- 如果文件存在并且與運(yùn)行命令的用戶(hù)具有相同的組,則為T(mén)rue。-h
FILE
- 如果文件存在并且是符號(hào)鏈接,則為T(mén)rue。-g
FILE
- 如果文件存在并已設(shè)置組id(sgid)標(biāo)志,則為T(mén)rue。-k
FILE
- 如果文件存在并設(shè)置了粘滯位標(biāo)志,則為T(mén)rue。-L
FILE
- 如果文件存在并且是符號(hào)鏈接,則為T(mén)rue。-O
FILE
- 如果文件存在并且由運(yùn)行該命令的用戶(hù)擁有,則為T(mén)rue。-p
FILE
- 如果文件存在并且是管道,則為T(mén)rue。-r
FILE
- 如果文件存在且可讀,則為T(mén)rue。-S
FILE
- 如果文件存在并且是套接字,則為T(mén)rue。-s
FILE
- 如果文件存在且大小不為零,則為T(mén)rue。-u
FILE
- 如果文件存在并且設(shè)置了(suid)標(biāo)志,則為T(mén)rue。-w
FILE
- 如果文件存在且可寫(xiě),則為T(mén)rue。-x
FILE
- 如果文件存在且可執(zhí)行,則為T(mén)rue。
06、寫(xiě)在最后
在本教程中,我們向您展示了如何在Linux系統(tǒng)中使用shell檢查文件或目錄是否存在。
到此這篇關(guān)于Linux中Shell腳本判斷文件/文件夾是否存在方法的文章就介紹到這了,更多相關(guān)Shell腳本判斷文件存在內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Shell腳本把文件從GBK轉(zhuǎn)為UTF-8編碼
這篇文章主要介紹了Shell腳本把文件從GBK轉(zhuǎn)為UTF-8編碼,需要的朋友可以參考下2014-06-06shell實(shí)現(xiàn)自動(dòng)adsl撥號(hào)并檢測(cè)連接狀況腳本分享
這篇文章主要介紹了shell實(shí)現(xiàn)自動(dòng)adsl撥號(hào)并檢測(cè)連接狀況腳本分享,本文給出了兩個(gè)腳本,一個(gè)是自動(dòng)撥號(hào)腳本,一個(gè)是檢測(cè)連接狀態(tài)腳本,需要的朋友可以參考下2014-12-12linux系統(tǒng)mysql自動(dòng)備份并使用ftp上傳的方法
這篇文章主要介紹了linux系統(tǒng)自動(dòng)導(dǎo)出mysql備份,并上傳到指定ftp,還可以刪除舊的備份文件,大家參考使用吧2014-01-01編寫(xiě)shell腳本實(shí)現(xiàn)tomcat定時(shí)重啟的方法
這篇文章主要介紹了編寫(xiě)shell腳本實(shí)現(xiàn)tomcat定時(shí)重啟的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Shell兩種for循環(huán)對(duì)應(yīng)實(shí)現(xiàn)方法解析
這篇文章主要介紹了Shell兩種for循環(huán)對(duì)應(yīng)實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Shell腳本實(shí)現(xiàn)查殺子進(jìn)程、僵尸進(jìn)程
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)查殺子進(jìn)程、僵尸進(jìn)程,本文直接給出實(shí)現(xiàn)代碼,實(shí)現(xiàn)遞歸找到導(dǎo)致進(jìn)程僵死的最底層子進(jìn)程并殺除,需要的朋友可以參考下2015-01-01shell Bash的數(shù)組與關(guān)聯(lián)數(shù)組的實(shí)現(xiàn)
本文主要介紹了shell Bash的數(shù)組與關(guān)聯(lián)數(shù)組的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02linux軟件版本管理命令update-alternatives使用詳解
這篇文章主要介紹了linux軟件版本管理命令update-alternatives使用詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04bash腳本編程學(xué)習(xí)之算術(shù)運(yùn)算與文件查找
算數(shù)運(yùn)算在每個(gè)編程語(yǔ)言里面是最基本的功能,在bash里面也是。下面這篇文章就給大家詳細(xì)介紹了腳本編程bash中的算術(shù)運(yùn)算與文件查找,文中還給出了多道練習(xí)題和答案,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-12-12