shell 腳本的測試和比較
test 指令:檢查檔案類型和比較數值的(根據表達式的執行結果(是真還是假),傳回一個退出狀态。)
NAME
test - check file types and compare values
DESCRIPTION
Exit with the status determined by EXPRESSION.
***************************************************************************************
檔案測試操作符:
-d (directory) 檔案存在且(&&)為目錄,傳回true
-f (file) 檔案存在且(&&)為普通檔案,傳回true
-e(exit) 檔案存在,傳回true
-r(read)檔案存在可讀,傳回true
-w(write)檔案存在可寫,傳回false
-x(executable)檔案存在可執行,傳回true
-L (link)檔案存在且為連結檔案,傳回true
file1 -nt file2 (nt==>newer then),以檔案的修改時間比較,檔案file1 比file2的新,傳回true
file1 -ot file2 (ot==>older then),以檔案的修改時間比較,檔案file1比file2的舊,傳回true
檢視檔案的屬性:可以通過ls 和stat :例如:
$ stat .bash_history
File: `.bash_history'
Size: 18690 Blocks: 40 IO Block: 4096 regular file
Device: 802h/2050d Inode: 1049700 Links: 1
Access: (0600/-rw-------) Uid: ( 500/ swallow) Gid: ( 500/ swallow)
Access: 2017-01-23 14:44:54.134193735 +0800
Modify: 2017-01-23 05:43:16.301220988 +0800
Change: 2017-01-23 05:43:16.301220988 +0800
$ ls -l .bash_history
-rw-------. 1 swallow swallow 18690 Jan 23 05:43 .bash_history
舉例測試:
$ file1=del.sh ;file2=sum.sh
$ echo $file1 $file2
del.sh sum.sh
$ ls -l $file1 $file2
-rw-rw-r--. 1 swallow swallow 81 Jan 21 20:14 del.sh
-rw-rw-r--. 1 swallow swallow 84 Jan 21 16:55 sum.sh
$ test -f $file1 && echo 0 || echo 1(測試file1是否為普通檔案。如果是傳回0 不是傳回1)
test 文法可以 簡寫為 [] 但是[] 在書寫的時候要注意 [] 和内容之間要空格。
$ [ -d $file2 ] && echo 0 || echo 1
1
$ [ $file1 -nt $file2 ] && echo 0 || echo 1
擴充:linux檔案權限體系的兩種表示方法。
r: 代表可讀 w:代表可寫 x: 代表可執行 這個是權限的rwx 表示方法:
與之對應的的數字表示方法: r: 4 w:2 x:1 即 4+2+1=7 (-:0沒有權限為0)
$ [ -x $file1 ] && echo 0 || echo 1
我們檢視一個系統腳本來體驗test的用法;
$ cat /etc/init.d/nfs
# Check for and source configuration file otherwise set defaults
[ -f /etc/sysconfig/nfs ] && . /etc/sysconfig/nfs
*****************************************************************************************
字元串測試操作符;比較2個字元串是否相同,測試字元串的長度為0或為null(空字元串)
-n "字元串" (nonzero) 字元串長度不為0 ,傳回true。也就是說字元串要内容
-z "字元串" (zero) 字元串長度為0,傳回true。字元串為空或不存在。
"字元串1" = "字元串2" 這裡 = 可用 == 代替
"字元串1" != "字元串2" 這裡 = 可用 == 代替
關注點: 1.這裡比較字元串最好将字元串用""包裹。例如"file1"
2. 如果判斷相等的時候,= 前後空格。在計算機裡面= 常被用來指派(var=123)
用一個不存的變量 var 測試 -n -z
[swallow@swallow ~]$ echo $var
[swallow@swallow ~]$ [ -n "$var" ] && echo 0 || echo 1
[swallow@swallow ~]$ [ -z "$var" ] && echo 0 || echo 1
邏輯操作符:
-a (and,與,兩端都為真,結果為真) 也可以寫成 &&
-o (or,或,兩端有一個是真,結果為真)也可以寫成 ||
!(not,非,兩端相反。則結果為真)
邏輯操作符是在上面單個判斷的基礎上來的 。需要結合單個判斷的結果,進行組合判斷。
需要注意的是: -a -o 多用于[]裡面 && || 多用于[]之外
*************************************************************************************
整數的二進制比較符
-eq (equal) (== 或=)
-ne (not equal) (!== 或!=)
-gt(greater than) (>)
-ge(greater equal)(>=)
-lt(less than) (<)
-le(less equal)(<=)
$ var1=23;var2=34
$ echo $var1 $var2
23 34
$ [ $var1 -gt $var2 ] && echo 0 || echo 1
本文轉自 swallow_zys 51CTO部落格,原文連結:http://blog.51cto.com/12042068/1894143,如需轉載請自行聯系原作者