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

Shell程式設計-05-Shell中條件測試與比較

Shell指令碼條件測試

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

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

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

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

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

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

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

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

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

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

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

test條件測試

  其基本語法如下所示:

test <測試表達式>

  示例如下所示:

[[email protected]
Test]# test -f para.sh && echo true || echo false true [[email protected] Test]# test -f para && echo true || echo false false

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

[]條件測試

  其基本語法如下所示:

[ <測試表達式> ]

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

[[email protected]
Test]# [ -f para.sh ] && echo true || echo false true [[email protected] Test]# [ -f para ] && echo true || echo false false

以上注意表示式與[]間的空格

[[]]條件測試

  其基本語法如下所示:

[[ <測試表達式> ]]

  其示例如下所示:

[[email protected] Test]# [[ -f para.sh ]] && echo true || echo false
true
[[email protected] 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進行檢視。

檔案測試表達式示例

[[email protected] Test]# [ -d ~/Test ] && echo true || echo false
true      # 判斷檔案是否為資料夾
[[email protected] Test]# [ -e ~/Test/eval.sh ] && echo true || echo false
true      # 判斷檔案是否存在
[[email protected] Test]# [ -e ~/Test/ ] && echo true || echo false
true      # 判斷檔案是否存在
[[email protected] Test]# [ -O ~/Test/ ] && echo true || echo false
true      # 判斷檔案是否存在且套上有效的UID
[[email protected] Test]# [ -G ~/Test/ ] && echo true || echo false
true      # 判斷檔案是否存在且套上有效的GID
[[email protected] Test]# ll -d ~/Test/
drwxr-xr-x 2 root root 123 11月  1 17:47 /root/Test/ # 顯示檔案資訊
[[email protected] Test]# [ -r ~/Test/ ] && echo true || echo false
true      # 判斷檔案是否存在及可讀許可權
[[email protected] Test]# [ -w ~/Test/ ] && echo true || echo false
true      # 判斷檔案是否存在及可寫許可權
[[email protected] Test]# [ -x ~/Test/ ] && echo true || echo false
true      # 判斷檔案是否存在及可執行許可權
[[email protected] 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
建立時間:-
[[email protected] Test]# [ eval.sh -ef exec.sh ] && echo true || echo false
false      # 判斷檔案是否存在相同的裝置和inode number
[[email protected] Test]# [ eval.sh -nt exec.sh ] && echo true || echo false
false      # 判斷檔案eval.sh修改日期是否比檔案exec.sh新
[[email protected] Test]# [ eval.sh -ot exec.sh ] && echo true || echo false
true      # 判斷檔案eval.sh修改日期是否比檔案exec.sh舊

[[email protected] Test]# echo $centos
        # 變數未定義
[[email protected] Test]# [ -f $centos ] && echo true || echo false
true    # 變數未定義,卻返回true,邏輯不符
[[email protected] 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、比較符號的兩端一定要新增空格

字元測試表達式示例

[[email protected] Test]# [ -n "Test" ] && echo true || echo false
true
[[email protected] Test]# [ -z "Test" ] && echo true || echo false
false
[[email protected] Test]# [ "Test" = "Test" ] && echo true || echo false
true
[[email protected] Test]# [ "Test" != "Test" ] && echo true || echo false
false
[[email protected] 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、比較符號兩端需要新增空格

整數測表示式示例

[[email protected] ~]# [ 8 > 4 ] && echo true || echo false
true
[[email protected] ~]# [ 4 > 8 ] && echo true || echo false
true            # 未進行轉義時,結果輸出存在錯誤
[[email protected] ~]# [ 4 \> 8 ] && echo true || echo false
false           # 進行轉義後,結果輸出正確
[[email protected] ~]# [ 8 != 8 ] && echo true || echo false
false
[[email protected] ~]# [ 8 == 8 ] && echo true || echo false
true
[[email protected] ~]# [ 8 = 8 ] && echo true || echo false
true
[[email protected] ~]# [ 4 -gt 8 ] && echo true || echo false
false
[[email protected] ~]# [ 4 -lt 8 ] && echo true || echo false
true
[[email protected] ~]# [ 8 -eq 8 ] && echo true || echo false
true
[[email protected] ~]# [ 8 -ne 8 ] && echo true || echo false
false
[[email protected] ~]# [[ 8 -ne 8 ]] && echo true || echo false
false
[[email protected] ~]# [[ 8 != 8 ]] && echo true || echo false
false
[[email protected] ~]# (( 8 != 8 )) && echo true || echo false
false
[[email protected] ~]# (( 8 == 8 )) && echo true || echo false
true
[[email protected] ~]# a=90;b=97 # 通過變數傳遞進行比較
[[email protected] ~]# [ $a -gt $b ] && echo true || echo false
false
[[email protected] ~]# [ $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僅適用於[],不能用在[[]]
  • []和[ [] ]兩端必須有空格,( ( ) )無此要求

邏輯測試表達式示例

[[email protected] ~]# [ 8>7 -a 9>2 ] && echo true || echo false
true
[[email protected] ~]# [ 8>7 -o 9>2 ] && echo true || echo false
true
[[email protected] ~]# [ 8>7 -o 9>21 ] && echo true || echo false
true
[[email protected] ~]# [  ! 9>21 ] && echo true || echo false
true
[[email protected] ~]# [ -f /etc/hosts -a /etc/passwd ] && echo true || echo false
true
[[email protected] ~]# a="/etc/hosts";b="/etc/passwd"
[[email protected] ~]# [ -f $a -o -f $b ] && echo true || echo false
true
[[email protected] ~]# [ -f "$a" ] && [ -f "$b" ] && echo true || echo false
true
[[email protected] ~]# [ -f $a ] && [ -f $b ] && echo true || echo false
true
[[email protected] ~]# [[ -f $a -a  -f $b ]] && echo true || echo false
-bash: 條件表示式中有語法錯誤
-bash: `-a' 附近有語法錯誤
[[email protected] ~]# [[ -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,或掃描下面的二維碼新增關注: MyQRCode.jpg