3.1 shell的條件測(cè)試
條件測(cè)試,作用是驗(yàn)證條件是否符合預(yù)期。以下是常用語法
| 條件測(cè)試語法 | 說明 |
|---|---|
| 語法1:test <測(cè)試表達(dá)式> | 利用test命令測(cè)試條件表達(dá)式。test命令和” <測(cè)試表達(dá)式>”之間至少有一個(gè)空格 |
| 語法2:[ <測(cè)試表達(dá)式> ] | 通過[](單中括號(hào))測(cè)試條件表達(dá)式的方法,和test命令的用法相同,注意[]的邊界和內(nèi)容之間至少有一個(gè)空格 |
| 語法3:[[ <測(cè)試表達(dá)式> ]] | 通過[[]](雙中括號(hào))測(cè)試條件表達(dá)式的值的方法,是比test和[]更新的語法格式。[[]]的邊界和內(nèi)容之間至少有一個(gè)空格 |
| 語法4:((測(cè)試表達(dá)式)) | 通過(())(雙小括號(hào))進(jìn)行測(cè)試條件表達(dá)式的方法,一般用于if語句里。(())雙小括號(hào)兩段不需要有空格 |
針對(duì)以上表有幾個(gè)注意事項(xiàng)需要說明:
- ? 語法1中的test命令和語法2中的[]是等價(jià)的。語法3中的[[]]為擴(kuò)展的test命令,語法4中的(())命令常用于計(jì)算,建議在生產(chǎn)環(huán)境中使用相對(duì)友好的語法2,即中括號(hào)[]的語法
- ? 在雙中括號(hào)[[]]中可以使用通配符(如*)等進(jìn)行模式匹配,這是區(qū)別于其他幾種語法的地方
- ? &&、||、>、<等操作符可以應(yīng)用到[[]]中,但不能應(yīng)用于[]中,在[]中一般用-a、-o、-gt、-lt取代
- ? 對(duì)于整數(shù)的關(guān)系運(yùn)算,也可以使用Shell的算術(shù)運(yùn)算符(())
- ? 條件測(cè)試簡單語法示例
n test條件測(cè)試語句示例

第一張.jpeg
n []條件測(cè)試語句示例

第二年.jpeg
- ? 特殊的條件測(cè)試表達(dá)式語句,可以執(zhí)行多個(gè)命令
[ 條件1 ] && {
命令1
命令2
...
}
[[ 條件1 ]] && {
命令1
命令2
...
}
test 條件1 && {
命令1
命令2
...
}
3.2 文件測(cè)試表達(dá)式
對(duì)于文件測(cè)試表達(dá)式中,常用的文件測(cè)試操作符如下所示:
| 類型 | 說明 |
|---|---|
| [ -f file ],f的全稱為file | 文件存在 |
| [ -e file ],e的全稱為exist | 文件(夾)存在 |
| [ -d dir ],d的全稱為directory | 是目錄 |
| [ -L file ],L的全稱為link | 是軟鏈接 |
| [ -s file ],s的全稱為size | 文件存在且非空 |
| [ -S file ],S的全稱為Socket | 文件是Socket文件 |
| [ -r file ],r的全稱為read | 文件可讀 |
| [ -w file ],w的全稱為write | 文件可寫 |
| [ -x file ],x的全稱為executable | 文件可執(zhí)行 |
練習(xí):
以腳本傳參和read讀入的方式輸入兩個(gè)文件路徑,任意一個(gè)文件不存在,則提示用戶第幾個(gè)文件不存在,并退出腳本(兩個(gè)腳本)
# 第一個(gè)文件不存在,則
[ -f $1 ] || {
echo "第一個(gè)文件不存在"
exit
}
# 第二個(gè)文件不存在,則
注:建議大家:在腳本的健壯性為前提下,重復(fù)的代碼盡量簡化
3.3 字符串測(cè)試表達(dá)式
字符串測(cè)試表達(dá)式的作用:比較兩個(gè)字符是否相同、測(cè)試字符串的長度是否為0、字符串是否為NULL等,常用的字符串操作符如下所示:
| 表達(dá)式 | 說明 |
|---|---|
| [ “ |
測(cè)試字符串是否相等。用作賦值時(shí)兩邊不能有空格,用做判斷時(shí)必須有空格。 |
| [ “ |
測(cè)試字符串是否不相等 |
| [ -n “$str” ] | 判斷字符串是否非空 |
| [ -z “$str” ] | 判斷字符串是否為空 |
| [ $str ] | 判斷字符串是否非空,類似于 -n |
注意:對(duì)于字符串測(cè)試的時(shí)候,一定要把字符串加雙引號(hào),如[ -n “myvar” ]、[ “b” ]
3.4 整數(shù)二元比較操作符
整數(shù)二元比較操作符使用參考
| 在[]以及test中使用的比較符號(hào) | 在(())和[[]]中使用的比較符號(hào) | 說明 |
|---|---|---|
| -eq | ==或= | 相等的英文equal |
| -ne | != | 不相等的英文not equal |
| -gt | > | 大于的英文greater than |
| -ge | >= | 大于等于的英文greater equal |
| -lt | < | 小于的英文less than |
| -le | <= | 小于等于的英文less equal |
注意:不推薦使用[[]]和>、<等符號(hào)比較數(shù)字,因?yàn)樵诖笮”容^中,[[]]比較的是字符串的arscII碼
有關(guān)[]、[[]]、(())用法小結(jié)
- ? 整數(shù)加雙引號(hào)比較也可以
- ? [[]]中使用類似-eq的寫法是正確的,而[[]]中用類似>、<的寫法也可能不對(duì),有可能值比較第一位,原因在于arscII碼的特殊性
- ? [[]]中用類似>、<的寫法語法沒錯(cuò)(經(jīng)過轉(zhuǎn)義),但是邏輯結(jié)果不對(duì),使用=、!=可以正確比較
- ? (())中不能使用類似-eq的寫法,可以使用類似>、<、==(=不可以)的寫法
- ? oldchang傾力推薦:在比較數(shù)字的時(shí)候推薦使用[]和-gt、-lt等類似的搭配,或者使用(())和>、<等搭配
3.5 邏輯操作符
| 在[]和test中使用操作符 | 在[[]]和(())中使用操作符 | 說明 |
|---|---|---|
| -a | && | and,與運(yùn)算,兩端都真則為真 |
| -o | || | or,或運(yùn)算,兩端有一個(gè)為真則真 |
| ! | ! | not,非,相反為真 |
注意,連接兩個(gè)含有[]、test或者[[]]的表達(dá)式用&&、||