1. 程式人生 > >Shell編程-05-Shell中條件測試與比較

Shell編程-05-Shell中條件測試與比較

etc 一個 命令 邊界 區別 link eval ash 程序

Shell腳本條件測試

? ? 在Shell腳本中各種條件結構和流程控制結構中會存在各種判斷比較,然後根據不同的判斷結果執行不同的操作或命令,返回的結果通常為真或假。常見的條件測試如下所示:

  • 條件測試-1
test <測試表達式>

利用test命令進行條件測試表達式,test命令和表達式中間至少有一個空格

  • 條件測試-2
[ <測試表達式> ]

利用[]進行條件測試的方法,表達式與[]前後均需要有至少一個空格

  • 條件測試-3
[[ <測試表達式> ]]

利用[ [ ] ]進行條件測試的方法,表達式與[ [ ] ]前後均需要有至少一個空格

  • 條件測試-4
((<測試表達式>))

利用(())進行條件測試的方法,表達式與(())前後不需要有空格,一般用於if語句

以上幾種用法的註意事項如下所示:

  • 1、test命令和[]功能是等價的
  • 2、[[]]是test命令的擴展
  • 3、(())常用於計算
  • 4、[[]]可以使用通配符進行模式匹配
  • 5、&&、||、<、>等操作符可以用在[[]],但不能用在[]中,在[]中一般用-a、-o、-gt、-lt等進行代替

test條件測試

? 其基本語法如下所示:

test <測試表達式>

? 示例如下所示:

[root@localhost Test]# test -f para.sh && echo true || echo false
true
[root@localhost Test]# test -f para && echo true || echo false
false

以上命令用於測試文件是否為普通文件或文件是否存在,如果是則輸出true,否則輸出false

[]條件測試

? 其基本語法如下所示:

[ <測試表達式> ]

? []與test功能是等價的,即test的所有判斷選項均可以直接在[]中使用。示例如下所示:

[root@localhost Test]# [ -f para.sh ] && echo true || echo false
true
[root@localhost Test]# [ -f para ] && echo true || echo false
false

以上註意表達式與[]間的空格

[[]]條件測試

? 其基本語法如下所示:

[[ <測試表達式> ]]

? 其示例如下所示:

[root@localhost Test]# [[ -f para.sh ]] && echo true || echo false
true
[root@localhost Test]# [[ -f para ]] && echo true || echo false
false

以上註意表達式與[[]]間的空格

- 1、以上幾種用法,推薦采用[]寫法,其他三種了解即可
- 2、如需查看更詳細的用法,可以使用man 進行查看

Shell文件測試

常用文件測試表達式

? 如果在編寫腳本時需要操作一個對象,需要先對對象進行測試,在滿足條件後才會進行相應的操作或命令,從而避免程序出錯和資源浪費。操作的對象通常為文件、字符串和數字等,常見的文件測試表達式如下所示:

文件操作符 英文含義 含義
-b FILE block 文件存在且為塊設備文件則為真
-c FILE character 文件存在且為字符設備文件則為真
-d FILE directory 文件夾存在則為真
-f FILE file 文件存在且為普通文件則為真
-e FILE exist 文件存在即為真,不區分文件或文件夾
-L FILE symbolic link 文件存在且為鏈接文件則為真
-O FILE owner 文件存在且屬主有有效的UID則為真
-G FILE group 文件存在且屬組有有效的GID則為真
-r FILE read 文件存在且具備可讀權限則為真
-s FILE size 文件存在且文件大小大於0則為真
-w FILE write 文件存在且具備可寫權限則為真
-x FILE executable 文件存在且具備可執行權限則為真
FILE1 -ef FILE2 equal FILE1和FILE2擁有同樣的設備和inode number則為真
FILE1 -nt FILE2 new than FILE1的修改日期比FILE2新則為真
FILE1 -ot FILE2 older than FILE1的修改日期比FILE2舊則為真

以上更詳細信息可使用命令man test進行查看。

文件測試表達式示例

[root@localhost Test]# [ -d ~/Test ] && echo true || echo false
true      # 判斷文件是否為文件夾
[root@localhost Test]# [ -e ~/Test/eval.sh ] && echo true || echo false
true      # 判斷文件是否存在
[root@localhost Test]# [ -e ~/Test/ ] && echo true || echo false
true      # 判斷文件是否存在
[root@localhost Test]# [ -O ~/Test/ ] && echo true || echo false
true      # 判斷文件是否存在且套上有效的UID
[root@localhost Test]# [ -G ~/Test/ ] && echo true || echo false
true      # 判斷文件是否存在且套上有效的GID
[root@localhost Test]# ll -d ~/Test/
drwxr-xr-x 2 root root 123 11月  1 17:47 /root/Test/ # 顯示文件信息
[root@localhost Test]# [ -r ~/Test/ ] && echo true || echo false
true      # 判斷文件是否存在及可讀權限
[root@localhost Test]# [ -w ~/Test/ ] && echo true || echo false
true      # 判斷文件是否存在及可寫權限
[root@localhost Test]# [ -x ~/Test/ ] && echo true || echo false
true      # 判斷文件是否存在及可執行權限
[root@localhost Test]# stat eval.sh exec.sh
  文件:"eval.sh"
  大小:68         塊:8          IO 塊:4096   普通文件
設備:802h/2050d   Inode:21590       硬鏈接:1
權限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近訪問:2018-11-01 17:32:31.559464328 +0800
最近更改:2018-11-01 17:32:19.712464490 +0800
最近改動:2018-11-01 17:32:19.713464490 +0800
創建時間:-
  文件:"exec.sh"
  大小:89         塊:8          IO 塊:4096   普通文件
設備:802h/2050d   Inode:21589       硬鏈接:1
權限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近訪問:2018-11-01 17:41:17.316457156 +0800
最近更改:2018-11-01 17:40:33.361457755 +0800
最近改動:2018-11-01 17:40:33.361457755 +0800
創建時間:-
[root@localhost Test]# [ eval.sh -ef exec.sh ] && echo true || echo false
false      # 判斷文件是否存在相同的設備和inode number
[root@localhost Test]# [ eval.sh -nt exec.sh ] && echo true || echo false
false      # 判斷文件eval.sh修改日期是否比文件exec.sh新
[root@localhost Test]# [ eval.sh -ot exec.sh ] && echo true || echo false
true      # 判斷文件eval.sh修改日期是否比文件exec.sh舊

[root@localhost Test]# echo $centos
        # 變量未定義
[root@localhost Test]# [ -f $centos ] && echo true || echo false
true    # 變量未定義,卻返回true,邏輯不符
[root@localhost Test]# [ -f "$centos" ] && echo true || echo false
false   # 添加引號後,邏輯正確

註意事項如下:

1、在判斷文件的讀寫執行權限,不單單是看文件rwx屬性,還要根據當前測試的用戶是否也具備相應的操作權限
2、在使用[]進行判斷時,需要註意雙引號特殊用法

Shell字符測試

常用字符測試表達式

? ?字符測試常用於判斷字符是否相同,長度是否為零、字符是否為空等,常見的字符測試如下所示:

字符操作符 英文含義 含義
-n STRING nonzero 字符串長度不為零,則為真
-z STRING zero 字符串長度為零,則為真
STRING1 = STRING2 STRING1和STRING2是相等,則為真
STRING1 != STRING2 STRING1和STRING2是不相等,則為真

字符測試註意事項:

1、字符測試中一定要添加雙引號
2、比較符號的兩端一定要添加空格

字符測試表達式示例

[root@localhost Test]# [ -n "Test" ] && echo true || echo false
true
[root@localhost Test]# [ -z "Test" ] && echo true || echo false
false
[root@localhost Test]# [ "Test" = "Test" ] && echo true || echo false
true
[root@localhost Test]# [ "Test" != "Test" ] && echo true || echo false
false
[root@localhost Test]# [ -z "" ] && echo true || echo false
true

Shell整數測試

常用整數測試表達式

[]/test比較符號 英文含義 ( ( ) )/[ [ ] ]比較符號
-eq equal ==/=
-ge greater than or equal >=
-gt greater than >
-le less than or equal <=
-lt less than <
-ne not equal !=

整數測試表達式註意事項如下所示:

1、=和!=也可以用在[]中進行比較,但在[]中使用< 和 > 時,需要進行轉義,否則結果會出現不正確的情況
2、比較符號兩端需要添加空格

整數測表達式示例

[root@localhost ~]# [ 8 > 4 ] && echo true || echo false
true
[root@localhost ~]# [ 4 > 8 ] && echo true || echo false
true            # 未進行轉義時,結果輸出存在錯誤
[root@localhost ~]# [ 4 \> 8 ] && echo true || echo false
false           # 進行轉義後,結果輸出正確
[root@localhost ~]# [ 8 != 8 ] && echo true || echo false
false
[root@localhost ~]# [ 8 == 8 ] && echo true || echo false
true
[root@localhost ~]# [ 8 = 8 ] && echo true || echo false
true
[root@localhost ~]# [ 4 -gt 8 ] && echo true || echo false
false
[root@localhost ~]# [ 4 -lt 8 ] && echo true || echo false
true
[root@localhost ~]# [ 8 -eq 8 ] && echo true || echo false
true
[root@localhost ~]# [ 8 -ne 8 ] && echo true || echo false
false
[root@localhost ~]# [[ 8 -ne 8 ]] && echo true || echo false
false
[root@localhost ~]# [[ 8 != 8 ]] && echo true || echo false
false
[root@localhost ~]# (( 8 != 8 )) && echo true || echo false
false
[root@localhost ~]# (( 8 == 8 )) && echo true || echo false
true
[root@localhost ~]# a=90;b=97 # 通過變量傳遞進行比較
[root@localhost ~]# [ $a -gt $b ] && echo true || echo false
false
[root@localhost ~]# [ $a -le $b ] && echo true || echo false
true

在使用整數比較時,需要註意數字必須是整數,否則會出現報錯。[]與(())區別如下所示:

[ number1 -lt number2 ] # 比較運算符兩端和[]間必須有空格
((number1<number2)) # (())無空格要求

Shell邏輯測試

常用邏輯測試表達式

[]/test比較符號 英文含義 ( ( ) )/[ [ ] ]比較符號
-a and &&
-o or ||
! not !

在以上邏輯測試結果中

  • 1:代表結果為真True
  • 0:代表結果為假False
  • -a和-o僅適用於[],不能用在[[]]
  • []和[ [] ]兩端必須有空格,( ( ) )無此要求

邏輯測試表達式示例

[root@localhost ~]# [ 8>7 -a 9>2 ] && echo true || echo false
true
[root@localhost ~]# [ 8>7 -o 9>2 ] && echo true || echo false
true
[root@localhost ~]# [ 8>7 -o 9>21 ] && echo true || echo false
true
[root@localhost ~]# [  ! 9>21 ] && echo true || echo false
true
[root@localhost ~]# [ -f /etc/hosts -a /etc/passwd ] && echo true || echo false
true
[root@localhost ~]# a="/etc/hosts";b="/etc/passwd"
[root@localhost ~]# [ -f $a -o -f $b ] && echo true || echo false
true
[root@localhost ~]# [ -f "$a" ] && [ -f "$b" ] && echo true || echo false
true
[root@localhost ~]# [ -f $a ] && [ -f $b ] && echo true || echo false
true
[root@localhost ~]# [[ -f $a -a  -f $b ]] && echo true || echo false
-bash: 條件表達式中有語法錯誤
-bash: `-a‘ 附近有語法錯誤
[root@localhost ~]# [[ -f $a &&  -f $b ]] && echo true || echo false
true

Shell條件測試總結

測試表達式符號 [ ] test [ [ ] ] ( ( ) )
邊界是否需要空格 需要 需要 需要 不需要
邏輯操作符 -a/-o/! -a/-o/! &&/||/! &&/||/!
整數比較符 -eq/-ge/-gt/-le/-lt/-ne -eq/-ge/-gt/-le/-lt/-ne -eq/-ge/-gt/-le/-lt/-ne或=/>=/>/<=/</!= =/>=/>/<=/</!=
字符串比較符 =/==/!= =/==/!= =/==/!= =/==/!=
是否支持通配符 不支持 不支持 支持 不支持

本文同步在微信訂閱號上發布,如各位小夥伴們喜歡我的文章,也可以關註我的微信訂閱號:woaitest,或掃描下面的二維碼添加關註:
技術分享圖片

Shell編程-05-Shell中條件測試與比較