判斷命令test通常用於腳本當中,能夠簡寫爲中括號[ ]。其會對跟隨的條件進行判斷,通常能夠分爲數值判斷、字符串判斷和文件判斷。語法格式爲test [判斷條件]或[ 判斷條件 ],注意中括號[ ]與判斷條件之間必須存在空格,還需注意判斷條件的判斷符號與比較值之間也須要存在空格。node
若是是test單獨使用,若是判斷條件爲真,那麼echo $?會返回0,判斷條件爲假返回1。正則表達式
(1).數值判斷shell
判斷符號 | 說明 | 範例 |
-eq | 相等則爲真 | [ $a -eq $b ] |
-ne | 不等則爲真 | [ $a -ne $b ] |
-gt | 大於則爲真 | [ $a -gt $b ] |
-ge | 大於等於則爲真 | [ $a -ge $b ] |
-lt | 小於則爲真 | [ $a -lt $b ] |
-le | 小於等於則爲真 | [ $a -le $b ] |
實例vim
[root@youxi1 ~]# vim a.sh #!/bin/bash read -p "請輸入第一個數字:" num1 read -p "請輸入第二個數字:" num2 if [ $num1 -eq $num2 ] ; then echo "第一個數字等於第二個數字" elif [ $num1 -gt $num2 ] ; then echo "第一個數字大於第二個數字" elif [ $num1 -lt $num2 ] ; then echo "第一個數字小於第二個數字" else echo "判斷失敗" fi [root@youxi1 ~]# sh a.sh 請輸入第一個數字:1 請輸入第二個數字:2 第一個數字小於第二個數字 [root@youxi1 ~]# sh a.sh 請輸入第一個數字:2 請輸入第二個數字:1 第一個數字大於第二個數字 [root@youxi1 ~]# sh a.sh 請輸入第一個數字:1 請輸入第二個數字:1 第一個數字等於第二個數字 [root@youxi1 ~]# sh a.sh 請輸入第一個數字:aa 請輸入第二個數字:bb a.sh: 第 4 行:[: aa: 期待整數表達式 a.sh: 第 6 行:[: aa: 期待整數表達式 a.sh: 第 8 行:[: aa: 期待整數表達式 判斷失敗
(2).字符串判斷bash
判斷符號 | 說明 | 範例 |
= | 相等則爲真 | [ $a = $b ] |
!= | 不等則爲真 | [ $a != $b ] |
-z 字符串 | 字符串長度爲0則爲真 | [ -z $a ] |
-n 字符串 | 字符串長度不爲0則爲真 | [ -n $n ] |
字符串1 > 字符串2 | 字符串1大於字符串2則爲真 | [ str1 \> str2 ] |
字符串1 < 字符串2 | 字符串1小於字符串2則爲真 | [ str1 \< str2 ] |
實例測試
[root@youxi1 ~]# vim a.sh #!/bin/bash read -p "請輸入第一個字符串:" str1 read -p "請輸入第二個字符串:" str2 if [ $str1 = $str2 ] ; then echo "兩個字符串相同" elif [ -n $str1 ] && [ -n $str2 ] ; then echo "兩個字符串非空" fi [root@youxi1 ~]# sh a.sh 請輸入第一個字符串:aaa 請輸入第二個字符串:bbb 兩個字符串非空
實例2:在作字符串大小比較時,須要注意一下幾點:1.字符串的順序,大於和小於的順序和sort排序是不同的;2.大於號和小於號必須轉義,要否則會被shell當作重定向符號;3.在test比較測試中,使用的是ASCII表,大寫字母小於小寫字母spa
[root@youxi1 ~]# vim a.sh #!/bin/bash read -p "請輸入第一個字符串:" str1 read -p "請輸入第二個字符串:" str2 if [ $str1 \> $str2 ] ; then echo "第一個字符串大於第二個字符串" else echo "第一個字符串小於第二個字符串" fi [root@youxi1 ~]# sh a.sh //證實比較的不是總和 請輸入第一個字符串:ab 請輸入第二個字符串:ba 第一個字符串小於第二個字符串 [root@youxi1 ~]# sh a.sh //如下兩個比較證實,是逐字比較 請輸入第一個字符串:aa 請輸入第二個字符串:ab 第一個字符串小於第二個字符串 [root@youxi1 ~]# sh a.sh 請輸入第一個字符串:aa 請輸入第二個字符串:ba 第一個字符串小於第二個字符串
(3).文件判斷blog
判斷符號 | 說明 | 範例 |
-e file | 文件或目錄存在則爲真 | [ -e file ] |
-r file | 文件存在且可讀則爲真 | [ -r file ] |
-w file | 文件存在且可寫則爲真 | [ -w file ] |
-x file | 文件存在且可執行則爲真 | [ -x file ] |
-s file | 文件存在且至少存在一個字符則爲真 | [ -s file ] |
-d file | 文件存在且爲目錄則爲真 | [ -d file ] |
-f file | 文件存在且爲普通文件則爲真 | [ -f file ] |
-c file | 文件存在且爲字符型文件則爲真 | [ -c file ] |
-b file | 文件存在且爲塊特殊文件則爲真 | [ -b file ] |
file1 -nt file2 | file1比file2新則爲真 | [ file1 -nt file2 ] |
file1 -ot file2 | file1比file2舊則爲真 | [ file1 -ot file2 ] |
file1 -ef file2 | file1和file2爲同一文件則爲真(硬連接,inode號) | [ file1 -ef file2 ] |
實例排序
[root@youxi1 ~]# vim a.sh #!/bin/bash read -p "請輸入第一個地址:" -r addr1 read -p "請輸入第二個地址:" -r addr2 if [ $addr1 -nt $addr2 ] ; then echo "文件1比文件2新" elif [ $addr1 -ot $addr2 ] ; then echo "文件1比文件2老" fi [root@youxi1 ~]# touch file1 file2 [root@youxi1 ~]# stat file1 文件:"file1" 大小:0 塊:0 IO 塊:4096 普通空文件 設備:fd00h/64768d Inode:33574997 硬連接:1 權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 最近訪問:2019-10-12 15:17:18.341481971 +0800 最近更改:2019-10-12 15:17:18.341481971 +0800 最近改動:2019-10-12 15:17:18.341481971 +0800 建立時間:- [root@youxi1 ~]# stat file2 文件:"file2" 大小:0 塊:0 IO 塊:4096 普通空文件 設備:fd00h/64768d Inode:33574998 硬連接:1 權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 最近訪問:2019-10-12 15:17:18.341481971 +0800 最近更改:2019-10-12 15:17:18.341481971 +0800 最近改動:2019-10-12 15:17:18.341481971 +0800 建立時間:- [root@youxi1 ~]# cat file2 [root@youxi1 ~]# stat file2 文件:"file2" 大小:0 塊:0 IO 塊:4096 普通空文件 設備:fd00h/64768d Inode:33574998 硬連接:1 權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 最近訪問:2019-10-12 15:32:06.337458140 +0800 最近更改:2019-10-12 15:17:18.341481971 +0800 最近改動:2019-10-12 15:17:18.341481971 +0800 建立時間:- [root@youxi1 ~]# sh a.sh //證實和訪問時間atime無關 請輸入第一個地址:/root/file1 請輸入第二個地址:/root/file2 [root@youxi1 ~]# echo bbb >> file2 [root@youxi1 ~]# stat file2 文件:"file2" 大小:4 塊:8 IO 塊:4096 普通文件 設備:fd00h/64768d Inode:33574998 硬連接:1 權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 最近訪問:2019-10-12 15:32:06.337458140 +0800 最近更改:2019-10-12 15:32:59.498600870 +0800 最近改動:2019-10-12 15:32:59.498600870 +0800 建立時間:- [root@youxi1 ~]# sh a.sh //應該是和更改時間mtime或改動時間ctime中的一個有關 請輸入第一個地址:/root/file1 請輸入第二個地址:/root/file2 文件1比文件2老
(4).特殊判斷符號字符串
判斷符號 | 說明 | 範例 |
-a或&& | 且,只有先後兩個判斷條件都成立才爲真,-a只能用於test命令和[]中,&&只能用於[[]]中或[]之間 | [ 判斷條件1 ] && [ 判斷條件2 ] [ 判斷條件1 -a 判斷條件2 ] [[ 判斷條件1 && 判斷條件2 ]] |
-o或|| | 或,先後兩個判斷條件有一個成立就爲真,-o只能用於test命令和[]中,||只能用於[[]]中或[]之間 | [ 判斷條件1 ] || [ 判斷條件2 ] [ 判斷條件1 -o 判斷條件2 ] [[ 判斷條件1 || 判斷條件2 ]] |
! | 取反 | [ ! 判斷條件 ] |
() | 改變表達式的優先級,注意加轉義字符 | [[ 判斷條件1 && (判斷條件2 && 判斷條件3) ]] |
(5).擴展:[[]]和[]的區別
1)[[]]是[]的擴充。[[]]可以支持*、<、>等特殊符號,不用轉義;
2)使用-a、&&、-o、||時,有着不一樣的限制;
3)[[]]能夠進行算術擴展,而[]不行;
4)[[]]可以使用正則表達式,而[]不行;
5)[[]]能夠使用通配符*、?、[list]、{list}和模糊匹配符號=~(符號前的參數包含符號後的參數則爲真),而[]不行
實例
[root@youxi1 ~]# vim a.sh #!/bin/bash if [[ aaaab =~ aaa ]] ; then echo ok else echo false fi [root@youxi1 ~]# sh a.sh ok