條件測試(test)命令共有三類條件測試表達式:node
第一類是進行數值的比較,第二類是進行字符串的比較,第三類是進行文件的測試,例如測試一個文件是否存在等等。
shell
1.數值測試,須要兩個操做數進行比較,即爲雙目測試符;express
-eq:測試兩個數值是否相等;相等爲真,不等爲假;bash
-ne:測試兩個數值是否不等;不等爲真,相等爲假;ide
-lt:小於,測試左邊數值是否小於右邊的數值;小於爲真,不小於爲假;測試
-gt:大於,測試左邊數值是否大於右邊的數值;大於爲真,不大於爲假;編碼
-le:小於等於,測試左邊數值是否不大於右邊數值;不大於爲真,大於爲假;spa
-ge:大於等於,測試左邊數值是否不小於右邊數值;不小於爲真,小於爲假;code
總結:eq相等,ne不相等,gt大於,lt小於,le小於等於,ge 大於等於orm
例如:
[root@localhost ~]# test 1 -eq 2
[root@localhost ~]# echo $?
1
[root@localhost ~]# test 1 -ne 2
[root@localhost ~]# echo $?
0
[root@localhost ~]# test 1 -lt 2
[root@localhost ~]# echo $?
0
[root@localhost ~]# test 1 -gt 2
[root@localhost ~]# echo $?
1
[root@localhost ~]# test 1 -le 2
[root@localhost ~]# echo $?
0
[root@localhost ~]# test 1 -ge 2
[root@localhost ~]# echo $?
1
也能夠用 [ ]
例如:
[root@localhost ~]# [ 1 -eq 2 ]
[root@localhost ~]# echo $?
1
效果是同樣的,要注意的是若是使用[]或[[]]進行條件判斷,在表達式的兩端都有留有空白字符,以區分命令和參數之間的關係;
注意:這類命令通常沒有執行結果,只有執行狀態返回值,因此當咱們要查看比對結果的時候須要使用echo命令將執行的結果顯示出來。
2.字符串測試:
雙目操做符:
==|=:被測試的兩個字符串是否相等,相同爲真,不一樣爲假;
例如:
~]$ [[ abc == abc ]]
~]$
echo
$?
0
~]$ [[ abc == aba ]]
~]$
echo
$?
1
!=:被測試的兩個字符是否不相同,不一樣爲真,相同爲假; 這個符號的功能與==相反;
例如:
~]$ [[ abc != abc ]]
~]$
echo
$?
1
~]$ [[ abc != aba ]]
~]$
echo
$?
0
>:測試左邊的字符串所對應的ASCII編碼是否比右邊的字符串對應的ASCII編碼大;大於爲真,小於爲假;
<:測試左邊的字符串所對應的ASCII編碼是否比右邊的字符串對應的ASCII編碼小;小於爲真,大於爲假;
例如:
~]$ [[ abc < abd ]]
~]$
echo
$?
0
~]$ [[ abc < abb ]]
~]$
echo
$?
1
=~:被測試的兩個字符串,左邊字符串可否被右邊的字符串匹配,能匹配爲真,不能匹配爲假;
例如:
~]$ [[ abc =~ aba ]]
~]$
echo
$?
1
~]$ [[ abcdef =~ abc ]]
~]$
echo
$?
0
注意:>, <, =~這三類測試操做符只能用在[[ expression ]]測試語句中,在單個[ ]是使用不了的;
單目操做符:
-z 'STRING':測試STRING是否爲空串;空串爲真,不空爲假;
-n 'STRING':測試STRING是否爲非空串;不空爲真,空串爲假;
注意:
1) 一般狀況下,字符串是要用引號引用的,單引號或雙引號均可以,只有在特定的狀況下,只能選擇單引號或雙引號之一;
2) []和[[]]在某些狀況下,意義不徹底相同,要區分對待;
3) 若是使用[]或[[]]進行條件判斷,在表達式的兩端都有留有空白字符,以區分命令和參數之間的關係;
4) 全部的雙目測試操做符和參數之間也要留有空白字符空間;
3.文件測試:
1)文件存在性測試
-a file:測試的文件存在爲真,不存在爲假;
-e file:測試的文件存在爲真,不存在爲假;
2)文件類型測試
-b file:被測試的文件是否存在而且是否爲塊設備;
-c file:被測試文件是否存在而且爲字符設備;
-d file:被測試文件是否存在而且爲目錄設備;
-f file:被測試文件是否存在而且爲普通文件;
-h|-L file:被測試的文件是否存在而且是否爲符號連接文件;
-s FILE:測試文件是否存在且其大小大於0;
-S file:被測試文件是否存在而且是否爲套接字文件;
-t file:測試文件描述符是否在終端上被打開;
3)文件的訪問權限設置:
-r file:被測試文件是否存在,而且當前有效用戶是否可讀;
-w file:被測試文件是否存在,而且當前有效用戶是否可寫;
-x file:被測試文件是否存在,而且當前有效用戶是否可執行;
4)文件特殊權限標識測試:
-u file:被測試的文件是否存在而且設置了SUID權限;
-g file:被測試文件是否存在而且設置了SGID權限;
-k file:被測試的文件是否存在而且是否設置了sticky權限;
5)文件全部權測試:
-O file:被測試的文件是否存在而且其屬主是否爲當前有效用戶;
-G file:被測試的文件是否存在而且其屬組是否爲當前有效用戶的所在組;
6)時間戳測試:
-N file:被測試文件自從上一次被修改以後,是否被修改過;
7)雙目測試:
file1 -ef file2 :測試的兩個文件是否指向同一個文件系統的相同inode的
8)硬連接測試:
file1 -nt file2:被測試的兩個文件,file1是否比file2更新;
file1 -ot file2:被測試的兩個文件,file1是否比file2更舊;
測試語句中能夠添加邏輯運算:
第一種表達式:
[ expression1 ] && [ expression2 ]
[ expression1 ] || [ expression2 ]
! [ expression ]
第二種表達式:
[ expression1 -a expression2 ]
[ expression1 -o expression2 ]
[ ! expression ]
在命令執行後會有一個結果的返回值,這個返回值分兩種,第一種是正常的命令的輸出結果,第二種是這個命令執行的狀態,有的時候可能會沒有第一種返回值,但必定會有第二種狀態返回值。狀態返回值的數字保存在「?」這個變量中,能夠經過「echo $?」命令進行查看。根據不一樣的狀態返回值的數字,咱們能夠判斷命令執行的狀態,命令的執行結果以下:
0:成功
1,2,127:爲系統保留的狀態返回值,在咱們本身編寫腳本的時候儘可能避開這些
3-126,128-255:用戶自定義的執行狀態返回值
注意:
當shell腳本運行時,一旦遇到exit命令,將當即結束運行此腳本的shell進程,同時此腳本的運行也會中止,其後續的全部命令都不會再被解釋執行;所以,包含了exit命令的腳本,不要使用source命令來執行;