判斷命令test

  判斷命令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
相關文章
相關標籤/搜索