shell編程基礎:test命令

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

# 刪除文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章