標籤:運算式 字串
test測試命令有三類測試運算式,第一類是進行數值的比較,第二類是進行字串的比較,第三類是進行檔案的測試,比如測試一個檔案是否存在等。
1.數值測試,需要兩個運算元進行比較
-eq:測試兩個資料是否相等,相等為真,不等為假
-ne:被測試的兩個數值是否不相等,不等為真,相等為假;
-lt:被測試的兩個數值,左邊的是否小於右邊的,小於為真,大於為假;
-gt:被測試的兩個數值,左邊的是否大於右邊的,大於為真,小於為假;
-le:被測試的兩個數值,左邊的是否小於等於右邊的;
總結一下就是:eq相等,ne不相等,gt大於,lt小於,ge大於等於,le 小於等於,not非,mod求模
~]$ test 3 -eq 4 ~]$ echo $? 1
~]$ test 3 -ne 4 ~]$ echo $? 0
~]$ test 3 -gt 4 ~]$ echo $? 1
~]$ test 3 -lt 4 ~]$ echo $? 0
在寫指令碼的時候我們會需要進行條件判斷,所以我們需要用到test命令,這種命令在指令碼裡時只需要將測試的內容寫在中括弧裡頭就可以了,比如以下兩種方法是相同的:
~]$ [ 2 -eq 2 ] ~]$ echo $?0
~]$ test 2 -eq 2 ~]$ echo $?0
注意:這類命令一般沒有執行結果,只有執行狀態傳回值,所以當我們要查看比對就過的時候需要使用echo命令將執行的結果顯示出來。
這個測試命令可以配合if等命令進行條件判斷,比如可以用vim寫一個指令碼:
#!/bin/bashif [ 1 -eq 1 ] ; then echo "相同"else echo "不相同"fi
~]$ vim b1 ~]$ bash b1相同
然後改一個數,就會輸出不相同:
#!/bin/bashif [ 1 -eq 2 ] ; then echo "相同"else echo "不相同"fi
~]$ vim b1 ~]$ bash b1不相同
像其他測試的條件也可以寫成這種指令碼,就不一一列舉了。
2.字串測試:
雙目操作符:
==|=:被測試的兩個字串是否相等,相同為真,不同為假;
比如:
~]$ [ abc == abc ] ~]$ echo $?0
~]$ [ abc == abd ] ~]$ echo $?1
!=:被測試的兩個字元是否不相同,不同為真,相同為假;
這個符號的功能與==相反,比如
~]$ [ abc != abc ] ~]$ echo $?1
~]$ [ abc != abd ] ~]$ echo $?0
>:被測試的兩個字串在ascll碼錶中對應的位元據,左邊是否大於右邊,大於為真,小於為假;
<:被測試的兩個字串在ascll碼錶中對應的位元據,左邊是否小於右邊,小於為真,大於為假;
比如:
~]$ [[ abc < abd ]] ~]$ echo $?0
~]$ [[ abc < abb ]] ~]$ echo $?1
注意:<,>和下頭的“=~”只在一個中括弧裡是不能執行的,只有在兩個中括弧的包裹下才能夠執行。
=~:被測試的兩個字串,左側字串,能否被右側的pattern匹配,能匹配為真,不能匹配為假;
~]$ [[ abc =~ abb ]] ~]$ echo $?1
~]$ [[ abc =~ ab ]] ~]$ echo $?0
上頭的兩個例子的結果是因為abb不能匹配abc,而ab可以匹配abc
單目操作符:
-z ‘string‘:判斷指定的字串是否為空白串;空為真,非空為假;
-n ‘string‘:判斷指定的字串是否為非空串;非空為真,空為假;
注意:
1.通常情況下,字串要加引號,單引號,雙引號,都行,根據實際情況;
2.[[]]和[]在某些情況下,可能意義不同,要區分使用;
3.運算式和操作符兩段都要加空格;
3.檔案狀態測試:
1)檔案存在性測試
-a file:測試的檔案存在為真,不存在為假;
-e file:測試的檔案存在為真,不存在為假;
(這兩個功能相似)
2)檔案類型測試(測試存在性)
-b file:被測試的檔案是否存在並且是否為塊裝置;
-c file:被測試檔案是否存在並且為字元裝置;
-d file:被測試檔案是否存在並且為目錄裝置;
-f file:被測試檔案是否存在並且為普通檔案;
-h|-L file:被測試的檔案是否存在並且是否為符號連結檔案;
-p file:被測試的檔案是否存在並且為通訊端檔案;
-S file:被測試檔案是否存在並且是否為通訊端檔案;
3)檔案的存取權限設定:
-r file:被測試檔案是否存在,並且當前有效使用者是否可讀;
-w file:被測試檔案是否存在,並且當前有效使用者是否可寫;
-x file:被測試檔案是否存在,並且當前有效使用者是否可執行;
4)檔案特殊許可權標識測試:
-u file:被測試的檔案是否存在並且設定了SUID許可權,檔案存在且設定SUID許可權則為真;否則為假;
-g file:被測試檔案是否存在並且設定了SGID許可權;
-k file:被測試的檔案是否存在並且是否設定了sticky許可權;
5)檔案所有權測試:
-O file:被測試的檔案是否存在並且其屬主是否為當前有效使用者;
-G file:被測試的檔案是否存在並且其屬組是否為當前有效使用者;
6)檔案內容是否為空白:
-s file:被測試的檔案是否存在並且內容不為空白,存在且內容不為空白則為真;否則為假;
7)時間戳記測試:
-N file:被測試檔案自從上一次被修改之後,是否被修改過;
8)雙目測試:
file1 -ef file2 :測試的兩個檔案是否指向同一個檔案系統的相同inode的
9)永久連結;
file1 -nt file2:被測試的兩個檔案,file1是否比file2更新;
file1 -ot file2:被測試的兩個檔案,file1是否比file2更舊;
測試語句中可以添加邏輯運算:
第一種運算式:
[ -O /tmp/test ] && [ -s /tmp/test ]
[ -O /tmp/test ] || [ -s /tmp/test ]
第二種運算式:
[ -O /tmp/test -a -s /tmp/test ]
[ -O /tmp/test -o -s /tmp/test ]
[ ! -O /tmp/test ]
以上這兩種運算式的作用是相同的
在命令執行後會有一個結果的傳回值,這個傳回值分兩種,第一種是正常的命令的輸出結果,第二種是這個命令執行的狀態,有的時候可能會沒有第一種傳回值,但一定會有第二種狀態傳回值。狀態傳回值的數字儲存在“?”這個變數中,可以通過“echo $?”命令進行查看。根據不同的狀態傳回值的數字,我們可以判斷命令執行的狀態,分別對應如下:
0:成功
1,2,127:為系統保留的狀態傳回值,在我們自己編寫指令碼的時候盡量避開這些
3-126,128-255:使用者自訂的執行狀態傳回值
當我們查到了這些數字之後可以通過剛才執行的命令的協助去查看每個數字對應到說明。在自己編寫的指令碼中也可以有傳回值,使用“exit”命令,後頭跟一個數字,就會返回這個數字。
注意:exit命令只能返回數字。
shell指令碼編程之條件測試——test