從零開始學(xué)習(xí)Linux(四十六):Shell編程之條件判斷

1、按照文件類型進(jìn)行判斷

測試選項(xiàng) 作用
-b 文件 判斷該文件是否存在,并且是否為塊設(shè)備文件(是塊設(shè)備文件為真)
-c 文件 判斷該文件是否存在,并且是否為字符設(shè)備文件(是字符設(shè)備文件為真)
-d 文件 判斷該文件是否存在,并且是否為目錄文件(是目錄為真)
-e 文件 判斷該文件是否存在(存在為真)
-f 文件 判斷該文件是否存在,并且是否為普通文件(是普通文件為真)
-L 文件 判斷該文件是否存在,并且是否為管道文件(是管道文件為真)
-p 文件 判斷該文件是否存在,并且是否為符號鏈接文件(是符號鏈接文件為真)
-s 文件 判斷該文件是否存在,并且是否為非空(非空為真)
-S 文件 判斷該文件是否存在,并且是否為套接字文件(是套接字文件為真)

其中-d 文件、-e 文件、-f 文件,這三種使用最多。

2、判斷命令格式

2.1、格式一

test -e /opt/shell/score.txt

執(zhí)行命令:

test -e /opt/shell/score.txt

使用echo $? 命令顯示剛剛的執(zhí)行結(jié)果。最終結(jié)果如下圖所示:

2.2、格式二(推薦使用這種方式)

[ -e /opt/shell/score12.txt ]

說明:中括號兩邊必須有空格,只能為[ -e /opt/shell/score.txt ]。

在判斷之后,可以使用echo $?來顯示執(zhí)行結(jié)果是否為真。也可以使用下方命令來顯示結(jié)果:

[ -e /opt/shell/score.txt ] && echo yes || echo no

執(zhí)行結(jié)果如下圖所示:

前面的文章中我們說過這種命令格式,當(dāng)?shù)谝粋€命令執(zhí)行成功的時候會打印yes,否則會打印no。

3、按照文件權(quán)限進(jìn)行判斷

測試選項(xiàng) 作用
-r 文件 判斷該文件是否存在,并且是否該文件擁有讀權(quán)限(有讀權(quán)限為真)
-w 文件 判斷該文件是否存在,并且是否該文件擁有寫權(quán)限(有寫權(quán)限為真)
-x 文件 判斷該文件是否存在,并且是否該文件擁有執(zhí)行權(quán)限(有執(zhí)行權(quán)限為真)
-u 文件 判斷該文件是否存在,并且是否該文件擁有SUID權(quán)限(有SUID權(quán)限為真)
-g 文件 判斷該文件是否存在,并且是否該文件擁有SGID權(quán)限(有SGID權(quán)限為真)
-k 文件 判斷該文件是否存在,并且是否該文件擁有SBit權(quán)限(有SBit權(quán)限為真)
3.1、查看文件是否有些權(quán)限

查看文件score.txt的權(quán)限,結(jié)果如下圖所示:

文件權(quán)限為-rw-r--r--;

判斷文件是否有寫權(quán)限,執(zhí)行命令:

[ -w score.txt ] && echo yes || echo no

此方式雖然能夠判斷權(quán)限,但是不夠精確。因?yàn)橄到y(tǒng)不會區(qū)分權(quán)限的所有者,比如判斷是否有寫權(quán)限-w,只要所有者、所屬組、其他人中有一個有寫權(quán)限,就會返回yes。

4、兩個文件之間進(jìn)行比較

測試選項(xiàng) 作用
文件1 -nt 文件2 判斷文件1的修改時間是否比文件2的新(如果新則為真)
文件1 -ot 文件2 判斷文件1的修改時間是否比文件2的舊(如果舊則為真)
文件1 -ef 文件2 判斷文件1是否和文件2的i節(jié)點(diǎn)號一致,可以理解為兩個文件是否為同一個文件。這個判斷用于判斷硬鏈接是很好的方法。
4.1、創(chuàng)建一個硬鏈接
ln /root/student.txt /tmp/stu.txt

執(zhí)行命令判斷兩個文件是否是硬鏈接:

[ /opt/shell/score.txt -ef /tmp/socre.txt ] && echo yes || echo no

5、兩個整數(shù)之間比較

測試選項(xiàng) 作用
整數(shù)1 -eq 整數(shù) 2 判斷整數(shù)1是否和整數(shù)2相等(相等為真)
整數(shù)1 -ne 整數(shù) 2 判斷整數(shù)1是否和整數(shù)2不相等(不相等位置)
整數(shù)1 -gt 整數(shù)2 判斷整數(shù)1是否大于整數(shù)2(大于為真)
整數(shù)1 -lt 整數(shù)2 判斷整數(shù)1是否小于整數(shù)2(小于位置)
整數(shù)1 -ge 整數(shù)2 判斷整數(shù)1是否大于等于整數(shù)2(大于等于為真)
整數(shù)1 -le 整數(shù)2 判斷整數(shù)1是否小于等于整數(shù)2(小于等于為真)
5.1、判斷23是否大于等于22

執(zhí)行命令:

[ 23 -ge 22 ] && echo yes || echo no

命令執(zhí)行結(jié)果:

5.2、判斷23是否小于等于22

執(zhí)行命令:

[ 23 -le 22 ] && echo yes || echo no

命令執(zhí)行結(jié)果:

6、字符串的判斷

測試選項(xiàng) 作用
-z 字符串 判斷字符串是否為空(為空返回真)
-n 字符串 判斷字符串是否為非空(非空返回真)
字串1 == 字串2 判斷字符串1是否和字符串2相等(相等返回真)
字串1 != 字串2 判斷字符串1是否和字符串2不相等(不相等返回真)
6.1、判斷變量是否存在

執(zhí)行命令,判斷是否存在username:

[ -z "$username" ] && echo yes || echo no

執(zhí)行結(jié)果如下圖所示:

由于此時不存在username,為空,所以返回yes。

給username變量賦值

username=zhoujielun

再次執(zhí)行命令結(jié)果如下圖所示:

6.2、判斷變量是否相等

定義變量x1=11,x2=22,判斷x1是否等于x2,執(zhí)行命令:

[ "$x1" == "$x2" ] && echo yes || echo no

命令執(zhí)行結(jié)果如下圖所示:

7、多重條件判斷

測試選項(xiàng) 作用
判斷1 -a 判斷2 邏輯與,判斷1和判斷2都成立,最終的結(jié)果才為真
判斷1 -o 判斷2 邏輯或,判斷1和判斷2有一個成立,最終的結(jié)果就為真
!判斷 邏輯非,使原始的判斷式取反

執(zhí)行命令,判斷變量x2是否有值,同時判斷變量x2的值是否大于23:

[ -n "$x2" -a "$x2" -gt 23 ] && echo yes || echo no

當(dāng)沒有變量x2的時候,執(zhí)行結(jié)果為no。定義x2=123以后,執(zhí)行結(jié)果為yes。為x2賦值12,執(zhí)行結(jié)果為no。如下圖所示:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

推薦閱讀更多精彩內(nèi)容