Bash Test Operators



前言

  • 寫 bash script 時實在是太常用到 test operators,但一個不注意又會忘記究竟是哪個 flag 更符合需求;想到趕快紀錄在這篇、自己查自己的文章。

  • 判斷時盡量使用雙中括號,比較現代也比較不會出錯。(參考 REF)

  • 冷知識:**[** ← 他是一個 bash 指令




說明

And / Or

1
2
3
4
5
-a       And 
&& 效果一樣

-o       OR
|| 效果一樣

整數比較

  • 中括號內比較:
    e.g.
    [[ "$a" -eq "$b" ]]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
-eq      is equal to
          判斷相等


-ne      is not equal to
          判斷不相等


-gt      is greater than
          判斷大於


-ge      is greater than or equal to
          判斷大於等於


-lt      is less than
          判斷小於


-le      is less than or equal to
          判斷小於等於
  • 雙括號內比較
    e.g.
    (("$a" < "$b"))
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<        is less than
          判斷小於


<=       is less than or equal to
          判斷小於等於


>        is greater than
          判斷大於


>=       is greater than or equal to
          判斷大於等於

字串比較

  • 雙中括號內比較:
    e.g.
    [[ "$a" =="z*" ]]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
==       is equal to  
          判斷等於

          但是在 () 中括號中,依據雙引號存在與否有不同的判斷結果:
          [[ $a == z* ]]   # True 如果 $a 是 "z" 開頭 (pattern matching)
          [[ $a == "z*" ]] # True 如果 $a 真的等於 "z*" (literal matching)

          [ $a == z* ]     # File globbing 與 word splitting 優先
          [ "$a" == "z*" ] # True 如果 $a 真的等於 "z*" (literal matching)


!=       is not equal to
          判斷不等於


<        is less than, in ASCII alphabetical order
          判斷 ASCII 字元順序小於


>        is greater than, in ASCII alphabetical order.
          判斷 ASCII 字元順序大於


-z       string is null
          判斷字串是空值、長度為 0


-n       string is not null.
          判斷字串不是空值

檔案相關的比較

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
-e       file exists
          判斷檔案存在
          (與 -a 相同但非常不建議使用 -a)


-f       file is a regular file (not a directory or device file)
          判斷是普通檔案 (非資料夾或裝置檔)


-d       file is a directory
          判斷是資料夾


-h, -L   file is a symbolic link
          判斷是軟連結


-b       file is a block device
          判斷是 block device


-c       file is a character device
          判斷是 character device


-p       file is a pipe
          判斷是 pipe


-S       file is a socket
          判斷是 socket


-s       file is not zero size
          判斷檔案非零 (> 0)


-t       file (descriptor) is associated with a terminal device
          判斷是否有連接 terminal 裝置
            [[ -t 0 ]] 檢查 stdin
            [[ -t 1 ]] 檢查 stdout
          來判斷 script 是否是在一個 terminal 中執行的。 


-r       file has read permission (for the user running the test)
          判斷檔案是否有「讀」的權限 (對執行這個判斷的使用者而言)


-w       file has write permission (for the user running the test)
          判斷檔案是否有「寫」的權限 (對執行這個判斷的使用者而言)


-x       file has execute permission (for the user running the test)
          判斷檔案是否有「執行」的權限 (對執行這個判斷的使用者而言)


-g       set-group-id (sgid) flag set on file or directory
          判斷 sgid 設立


-u       set-user-id (suid) flag set on file
          判斷 suid 設立


-k       sticky bit set
          判斷 sticky bit 設立 (限制只有 owner 與 root 可以刪除或移動內容物)


-O       you are owner of file
          判斷自己是檔案擁有者

-G       group-id of file same as yours
          判斷檔案 Group id 跟自己相同


-N       file modified since it was last read
          判斷自從上次讀取後,檔案修改過


-nt      file f1 is newer than f2
          判斷檔案 f1 比 f2 還要新


-ot      file f1 is older than f2
          判斷檔案 f1 比 f2 還要舊


-ef      files f1 and f2 are hard links to the same file
          判斷 f1 與 f2 的硬連結為同一個


!        "not"
          反轉上述條件判斷結果



REF


主題 StackJimmy 設計