1. 簡介
命令格式:
# 格式1
test condition
# 格式2,注意中括號前後都有空格
[ condition ]
命令解釋:
condition
是test命令要測試的一系列參數和值,如果成立則退出狀態碼爲0
,否則爲非0
,因此在分支和循環中可以使用test命令進行流程控制)。
test命令可以判斷三類條件:
2. 數值比較
使用test命令最常見的情形是對兩個數值進行比較。如下表所示:
比 較 | 描 述 |
---|---|
n1 -eq n2 | 檢查n1是否與n2相等 |
n1 -ge n2 | 檢查n1是否大於或等於n2 |
n1 -gt n2 | 檢查n1是否大於n2 |
n1 -le n2 | 檢查n1是否小於或等於n2 |
n1 -lt n2 | 檢查n1是否小於n2 |
n1 -ne n2 | 檢查n1是否不等於n2 |
2.1 數值比較示例
# $?用於返回上個命令退出狀態碼
#@@@@ -eq測試
# 1 -eq 2條件不成立,因此退出狀態碼非0(此處爲1)
[root@vm14 ~]# test 1 -eq 2 ; echo $?
1
# 1 -eq 1條件成立,因此退出狀態碼爲0
[root@vm14 ~]# test 1 -eq 1 ; echo $?
0
#@@@@ -ne測試
# 條件1 -ne 1不成立,因此退出狀態碼爲非0(此處爲1)
[root@vm14 ~]# [ 1 -ne 1 ]; echo $?
1
# 添加1 -ne 2成立,因此退出狀態碼爲0
[root@vm14 ~]# [ 1 -ne 2 ]; echo $?
0
2.2 使用雙括號
雙括號命令允許你在比較過程中使用高級數學表達式。格式:(( expression ))
雙括號命令符號
符 號 | 描 述 |
---|---|
val++ | 後增 |
val– | 後減 |
++val | 先增 |
–val | 先減 |
! | 邏輯求反 |
~ | 位求反 |
** | 冪運算 |
<< | 左位移 |
>> | 右位移 |
& | 位布爾和 |
| | 位布爾或 |
&& | 邏輯和 |
|| | 邏輯或 |
# 雙括號中的空格時可以省略的
[root@vm14 ~]# (( 2>1 ));echo $?
0
[root@vm14 ~]# (( 2<1 ));echo $?
1
3. 字符串比較
條件測試還允許比較字符串值。如下表所示:
比 較 | 描 述 |
---|---|
str1 = str2 | 檢查str1是否和str2相同 |
str1 != str2 | 檢查str1是否和str2不同 |
str1 < str2 | 檢查str1是否比str2小 |
str1 > str2 | 檢查str1是否比str2大 |
-n str1 | 檢查str1的長度是否非0 |
-z str1 | 檢查str1的長度是否爲0 |
3.1 是否相等
#@@@@ =測試
# 條件"str1" = "str2"條件不成立,因此退出狀態碼非0(此處爲1)
[root@vm14 ~]# [ "str1" = "str2" ]; echo $?
1
# 條件"str1" = "str1"條件成立,因此退出狀態碼爲0
[root@vm14 ~]# [ "str1" = "str1" ]; echo $?
0
3.2 大小判斷
當進行字符串大於或小於排序時,需要對> < 符號進行轉義
#@@@@ >< 測試
# 條件"str1" > "str2"不成立,因此退出狀態碼爲非0(此處爲1)
[root@vm14 ~]# [ "str1" \> "str2" ]; echo $?
1
# 條件"str1" < "str2"成立,因此退出狀態碼爲0
[root@vm14 ~]# [ "str1" \< "str2" ]; echo $?
0
# 在比較大小寫時,test命令與sort結果相反,test是正常邏輯(ASCII值比較--與java一致)
# sort命令使用的是系統的本地化語言設置中定義的排序順序。對於英語,本地化設置指定了在排序順序中小寫字母出現在大寫字母前
# sort命令認爲小寫a小於大寫A
[root@vm14 ~]# echo -e "A\na" |sort
a
A
# test命令認爲小寫a大於大寫A
[root@vm14 ~]# [ "a" \> "A" ] ; echo $?
0
3.3 是否爲空
#@@@@ -n -z測試
# 當你什麼也不傳的時候,這裏命令退出狀態碼都爲0
[root@vm14 ~]# [ -n ] ; echo $?
0
[root@vm14 ~]# [ -z ] ; echo $?
0
# 因此當你檢測變量是否爲空時要特別小心,因爲你沒法判斷出來正確的結果
[root@vm14 ~]# [ -n $not_exist ] ; echo $?
0
[root@vm14 ~]# [ -z $not_exist ] ; echo $?
0
# 選擇1:加上雙引號
[root@vm14 ~]# [ -z "$not_exist" ] ; echo $?
0
[root@vm14 ~]# [ -n "$not_exist" ] ; echo $?
1
# 選擇2:使用雙方括號: [[ condition ]]
[root@vm14 ~]# [[ -z $not_exist ]] ; echo $?
0
[root@vm14 ~]# [[ -n $not_exist ]] ; echo $?
1
3.4 模式匹配
雙方括號命令提供了針對字符串比較的高級特性-模式匹配。雙方括號命令的格式如下: [[ expression ]]
# 測試字符串root是否以r開頭
[root@vm14 ~]# [[ "root" = r* ]]; echo $?
0
# 測試字符串root是否以a開頭
[root@vm14 ~]# [[ "root" = a* ]]; echo $?
1
3. 文件比較
文件比較允許你測試Linux文件系統上文件和目錄的狀態。如下表所示:
比 較 | 描 述 |
---|---|
-d file | 檢查file是否存在並是一個目錄 |
-e file | 檢查file是否存在 |
-f file | 檢查file是否存在並是一個文件 |
-r file | 檢查file是否存在並可讀 |
-s file | 檢查file是否存在並非空 |
-w file | 檢查file是否存在並可寫 |
-x file | 檢查file是否存在並可執行 |
-O file | 檢查file是否存在並屬當前用戶所有 |
-G file | 檢查file是否存在並且默認組與當前用戶相同 |
file1 -nt file2 | 檢查file1是否比file2新 |
file1 -ot file2 | 檢查file1是否比file2舊 |
3.1 文件or目錄
# 創建測試用目錄和文件
[root@vm14 ~]# mkdir testdir
[root@vm14 ~]# touch testdir/testfile
# 判斷是否爲目錄
[root@vm14 ~]# [ -d testdir ]; echo $?
0
[root@vm14 ~]# [ -d testdir/testfile ]; echo $?
1
# 判斷是否爲文件
[root@vm14 ~]# [ -f testdir ]; echo $?
1
[root@vm14 ~]# [ -f testdir/testfile ]; echo $?
0
# 刪除測試目錄
[root@vm14 ~]# rm -rf testdir/
3.2 檢查文件權限
# 創建測試文件
[root@vm14 ~]# touch testfile
# 查看文件權限,此時具備讀寫權限,不具備執行權限
[root@vm14 ~]# ll testfile
-rw-r--r--. 1 root root 0 2020-04-12 13:26:09 testfile
# 讀、寫、執行權限測試
[root@vm14 ~]# [ -r testfile ]; echo $?
0
[root@vm14 ~]# [ -w testfile ]; echo $?
0
[root@vm14 ~]# [ -x testfile ]; echo $?
1
# 刪除文件