Shell 腳本可以使用條件邏輯,使腳本可以根據(jù)參數(shù)醒叁、Shell 變量或是其他條件的值采取不同的行動回窘。test 命令允許你做各種測試并在測試成功或失敗時返回它的退出狀態(tài)碼(為0表示為真冯挎,為1表示為假)泉瞻。使用這個狀態(tài)碼,可以讓 Bash 對測試的結(jié)果做出反應(yīng)五嫂。
test 命令可以用于:
- 文件屬性測試颗品;
- 字符串測試;
- 算術(shù)測試沃缘。
test 命令的語法為:
test EXPRESSION
或
[ EXPRESSION ]
下面是幾個簡單的示例:
上述實例中的第一個是文件屬性的測試躯枢,使用 -d 操作符測試變量 $HOME 的值(當(dāng)前賬號的 HOME 目錄)是否為一個目錄并且此目錄是否存在,此例中的退出狀態(tài)碼為 0槐臀,表示存在此目錄锄蹂。第二個實例是字符串的比較,使用 “!=” 操作符比較兩個字符串是不是不相等水慨,此例中的退出狀態(tài)碼為 0得糜,表示兩個字符串不相等。最后一個實例是算術(shù)比較晰洒,使用 “-gt” 操作符比較第一個數(shù)是否大于第二個數(shù)朝抖,如果大于,則輸出 True谍珊,否則打印 False治宣。
文件屬性測試操作符表###
操作符 | 描述 |
---|---|
-e <FILE> | 如果 <FILE> 存在則為真 |
-f <FILE> | 如果 <FILE> 存在且是一個常規(guī)文件則為真 |
-d <FILE> | 如果 <FILE> 存在且是一個目錄則為真 |
-c <FILE> | 如果 <FILE> 存在且是一個特殊字符文件則為真 |
-b <FILE> | 如果 <FILE> 存在且是一個特殊塊文件則為真 |
-p <FILE> | 如果 <FILE> 存在且是一個命名管道則為真 |
-S <FILE> | 如果 <FILE> 存在且是一個套接字文件則為真 |
-L <FILE> | 如果 <FILE> 存在且是一個符號鏈接則為真(與 -h 相同) |
-h <FILE> | 如果 <FILE> 存在切實一個符號鏈接則為真(與 -L 相同) |
-g <FILE> | 如果 <FILE> 存在且是設(shè)置了 sgid 位則為真 |
-u <FILE> | 如果 <FILE> 存在且是設(shè)置了 suid 位則為真 |
-r <FILE> | 如果 <FILE> 存在且是可讀的則為真 |
-w <FILE> | 如果 <FILE> 存在且是可寫的則為真 |
-x <FILE> | 如果 <FILE> 存在且是可執(zhí)行的則為真 |
-s <FILE> | 如果 <FILE> 存在且不為空則為真 |
-t <fd> | 如果文件描述符 <fd> 已打開且引用了一個終端則為真 |
<FILE1> -nt <FILE2> | 如果 <FILE1> 比 <FILE2> 新則為真(指 mtime) |
<FILE1> -ot <FILE2> | 如果 <FILE1> 比 <FILE2> 舊則為真(指 mtime) |
<FILE1> -ef <FILE2> | 如果 <FILE1> 有硬鏈接到 <FILE2> 則為真 |
實例 1,檢查文件是否存在:
注意:上述命令語句中的 “$_” 表示前一個執(zhí)行的命令中的最后一個參數(shù)砌滞。
字符串測試操作符表###
操作符 | 描述 |
---|---|
-z <STRING> | 如果 <STRING> 為空則為真 |
-n <STRING> | 如果 <STRING> 不為空則為真 |
<STRING1> = <STRING2></br><STRING1> != <STRING2></br><STRING1> \< <STRING2></br><STRING1> \> <STRING2> | 字符串比較 ASCII 碼順序 |
算術(shù)測試操作符表###
操作符 | 描述 |
---|---|
<INTEGER1> -eq <INTEGER2> | 如果 <INTEGER1> 與 <INTEGER2> 相等則為真 |
<INTEGER1> -ne <INTEGER2> | 如果 <INTEGER1> 與 <INTEGER2> 不相等則為真 |
<INTEGER1> -le <INTEGER2> | 如果 <INTEGER1> 小于或等于 <INTEGER2> 則為真 |
<INTEGER1> -ge <INTEGER2> | 如果 <INTEGER1> 大于或等于 <INTEGER2> 則為真 |
<INTEGER1> -lt <INTEGER2> | 如果 <INTEGER1> 小于 <INTEGER2> 則為真 |
<INTEGER1> -gt <INTEGER2> | 如果 <INTEGER1> 大于 <INTEGER2> 則為真 |
在 Bash 中還有一個 “[[]]” 關(guān)鍵字炼七,它是 “[]” 的提高版本:
[[ EXPRESSION ]]
但是 “[[]]” 關(guān)鍵字僅在 Bash、Zsh 和 Korn Shell 中可用布持,而 “[]” 幾乎可以在任意一種 Shell 下(只要符合 POSIX 標(biāo)準(zhǔn))使用。盡管 “[[]]” 和 “[]” 有許多共同點陕悬,它們共有很多表達式操作符题暖,如 -f、-s、-n 和 -z 等胧卤,但它們還有一些明顯的不同唯绍。
“[[]]” 和 “[]” 之間不同的比較###
Feature | [[]] | [] | Example | ||
---|---|---|---|---|---|
String comparison | > < | \> \< | [[ a > b ]]</br>[ a \> b] | ||
Expression grouping | (...) | (...) | [[ $var=img* && ($var = *.png | $var = *.jpg ]] | |
Pattern matching | = | (not available) | [[ $name = a* ]] | ||
RegularExpression matching | =~ | (not available) | [[ $(date) =~ ^Fri...\13]] |
本文參考自 《Linux Shell命令行及腳本編程實例詳解 》