概述
條件判斷是學習shell腳本之前要掌握的重點基礎。條件判斷分為以下幾類:文件判斷、數值判斷、字符判斷。而文件判斷還可以細分到:文件類型判斷、文件權限判斷、文件所屬判斷、文件之間屬性判斷;
舉個例子,如果我們要判斷/tmp下是否存在facker這個目錄或文件,可以結合&&和||命令來獲取到結果:
[facker@facker6 tmp]$ test -e facker && echo "file exit." || echo "file not found." file not found. [facker@facker6 tmp]$ ls fstab functions grub.conf [facker@facker6 tmp]$
從結果中回顯可以看到,在我的/tmp目錄下的確是不存在facker的目錄或文件??梢钥闯?,-e這個東東是測試文件的存在與否的,那還有沒有其它EXPRESSION呢,答案是有的。
test語法如下:
[facker@facker6 tmp]$ test EXPRESSION FILENAME #上面說的-e就是這里的EXPRESSION啦!
還有另外的一種語法格式:
[facker@facker6 tmp]$ [ EXPRESSION FILENAME ]
1、文件類型判斷
EXPRESSION | 作用 |
-e |
判斷文件是否存在 |
–b | 判斷文件是否存在,并且是否為普通文件 |
-d |
判斷文件是否存在,并且是否為目錄 |
-b | 判斷文件是否存在,并且是否為塊設備文件(block file) |
-c | 判斷文件是否存在,并且是否為字符設備文件 |
-L | 判斷文件是否存在,并且是否為符號連接文件 |
-p | 判斷文件是否存在,并且是否為管道文件 |
-s | 判斷文件是否存在,并且是否為空文件 |
-S | 判斷文件是否存在,并且是否為套接字文件 |
2、按照文件權限來判斷
EXPRESSION |
作用 |
-r |
判斷文件是否存在,且對當前操作用戶是否擁有讀權限 |
-w | 判斷文件是否存在,且對當前操作用戶是否擁有寫權限 |
-x |
判斷文件是否存在,且對當前操作用戶是否擁有執行權限 |
-u | 判斷文件是否存在,并且SUID是否置位 |
-g | 判斷文件是否存在,并且SGID是否置位 |
-k | 判斷文件是否存在,并且SBit是否置位 |
3、按照文件被操作后的判斷
EXPRESSION |
作用 |
-t fd |
判斷文件是否存在,且文件的描述符是否已經打開并且與某終端相關 |
-N | 判斷文件是否存在,且文件最后一次被讀取時內容是否修改 |
-O |
判斷文件是否存在,且當前操作用戶是否為文件的屬主 |
-G | 判斷文件是否存在,且文件與當前操作用戶是否為同一個屬組 |
4、兩個文件之間進行比較(雙目比較)
EXPRESSION |
作用 |
文件1 -nt 文件2 |
判斷文件1的修改時間是否比文件2的新(多用于配置文件備份) |
文件1 -ot 文件2 | 判斷文件1的修改時間是否比文件2的舊 |
文件1 -ef 文件2 | 判斷文件1和文件2的inode號是否一致(判斷是否為硬鏈接) |
5、兩個整數之間進行比較(雙目比較)
EXPRESSION |
作用 |
整數1 -eq 整數2 |
判斷整數1和整數2是否相等 |
整數1 -ne 整數2 | 判斷整數1和整數2是否不等 |
整數1 -gt 整數2 | 判斷整數1是否大于整數2 |
整數1 -lt 整數2 | 判斷整數1是否小于整數2 |
整數1 -ge 整數2 | 判斷整數1是否大于等于整數2 |
整數1 -le 整數2 | 判斷整數1是否小于等于整數2 |
6、兩個字符串之間進行比較
EXPRESSION |
作用 |
-z 字符串 |
判斷字符串是否為空 |
-n 字符串 |
判斷字符串是否為非空 |
字符串1 == 字符串2 |
判斷字符串1是否和字符串2相等 |
字符串1 != 字符串2 | 判斷字符串1是否和字符串2不相等 |
字符串1 > 字符串2 | 判斷字符串1是否大于字符串2 |
字符串1 < 字符串2 | 判斷字符串1是否小于字符串2 |
字符串1 ~= 字符串2 | 判斷字符串1能否被右側的PATTERN所匹配,該表達式寫為 [[ 字符串1 ~= 字符串2 ]] |
多重條件判斷
EXPRESSION |
作用 |
判斷1 -a 判斷2 |
邏輯與,判斷1和判斷2都成立,結果為真 |
判斷1 -o 判斷2 |
邏輯或,判斷1和判斷2有一個成立,結果為真 |
! 判斷 |
邏輯非,使原始的判斷式取反 |
練習
好了,干貨分享完了,我們來幾道練習來驗證一下是不是真的可行吧。
習題1:測試文件test.conf是否要比test.conf.bak新,如果是,則更新test.conf.bak。
[facker@facker6 tmp]$ touch test.conf test.conf.bak #通過touch命令創建兩個空白文件 [facker@facker6 tmp]$ echo 123 > test.conf #向test.conf文件寫入123 [facker@facker6 tmp]$ cat test.conf test.conf.bak 123 [facker@facker6 tmp]$ [ test.conf -nt test.conf.bak ] && cp -f test.conf test.conf.bak || echo "File not change." [facker@facker6 tmp]$ cat test.conf test.conf.bak #如果兩個文件一致,則會輸出兩行123 123 123
習題2:測試當前用戶是否對/etc/shadow文件是否擁有讀寫權限。
[facker@facker6 tmp]$ whoami facker [facker@facker6 tmp]$ ls -ld /etc/shadow ---------- 1 root root 848 Dec 20 19:06 /etc/shadow #shadow文件對于當前用戶來說是既不可讀也不可寫的 [facker@facker6 tmp]$ [ -r /etc/shadow -o -w /etc/shadow ] && echo "i can read or write this file." || echo "i do not have permission." i do not have permission. [facker@facker6 tmp]$
參考資料
-
《馬哥Linux教學》
-
《鳥哥私房菜基礎篇》
原創文章,作者:facker,如若轉載,請注明出處:http://www.www58058.com/10312
內容專業,排版漂亮,已置頂