對檔案、字串和數字使用test命令。
對數字和字串使用expr命令。
expr命令測試和執行數值輸出。使用最後退出狀態命令 $? 可測知tes t和expr,二者均以0表示正確,1表示返回錯誤。
expr用法
expr命令一般用於整數值,但也可用於字串。一般格式為:
expr argument operator argument
expr也是一個手工命令列計數器。
# expr 10 + 10
20
# expr 1500 + 900
2500
# expr 30 / 3
10
# expr 30 / 3 / 2
5
(注意運算子左右都有空格)
使用乘號時,必須用反斜線屏蔽其特定含義。因為shell可能會誤解顯示星號的意義。
# expr 30 * 3
(正確操作)
# expr 5 \* 4
增量計數
expr在迴圈中用於增量計算。首先,迴圈初始化為0,然後迴圈值加1,反引號的用法意
即替代命令。最基本的一種是從(expr)命令接受輸出並將之放入迴圈變數。
# LOOP=0
# LOOP=`expr $LOOP + 1`
數值測試
可以用expr測試一個數。如果試圖計算非整數,將返回錯誤。
# rr=1.1
# expr $rr + 1
expr: non-numeric argument
$rr=2
# expr $rr + 1
3
這裡需要將一個值賦予變數(不管其內容如何),進行數值運算,並將輸出匯入dev/null,
然後測試最後命令狀態,如果為0,證明這是一個數,其他則表明為非數值。
# value=12
# expr $value + 10 > /dev/null 2>&1
# echo $?
0
這是一個數。
# value=hello
# expr $value + 10 > /dev/null 2>&1
# echo $?
2
這是一個非數值字元。
expr也可以返回其本身的退出狀態,不幸的是傳回值與系統最後退出命令剛好相反,成
功返回1,任何其他值為無效或錯誤。下面的例子測試兩個字串是否相等,這裡字串為
“hello”和“hello”。
# value=hello
# expr $value = "hello"
1
# echo $?
0
expr返回1。不要混淆了,這表明成功。現在檢驗其最後退出狀態,返回0表示測試成功,
“hello”確實等於“hello”。
test用法
test一般有兩種格式,即:test condition 或 [ condition ] 。使用方括弧時,要注意在條件兩邊加上空格。
熱門檔案狀態測試:
- d 目錄
- s 檔案長度大於0、非空
- f 正規檔案
- w 可寫
- L 符號串連
- u 檔案有suid位設定
- r 可讀
- x 可執行
- c 字元裝置檔案
使用兩種方法測試檔案scores.txt是否可寫並用最後退出狀態測試是否成功。記住:0表示成功,其他為失敗。
[root@localhost ~]# ls -l
-rw-r--r-- 1 root root 5 Sep 21 18:43 scores.txt
[root@localhost ~]# [ -w scores.txt ]
[root@localhost ruby]# echo $?
0
[root@localhost ~]# test -w scores.txt
[root@localhost ~]# echo $?
0
注意,這個的是否讀、寫、執行是根據目前使用者對這個檔案所擁有的許可權而言的。如果我們換另一個使用者,結果就不一定了。
測試時使用邏輯操作符
-a 邏輯與,操作符兩邊均為真,結果為真,否則為假。
-o 邏輯或,操作符兩邊一邊為真,結果為真,否則為假。
!邏輯否,條件為假,結果為真。
[root@localhost ~]# ls -l
-rw-r--r-- 1 root root 0 Sep 21 19:39 a
-rw-r--r-- 1 root root 0 Sep 21 19:39 b
[root@localhost ~]# [ -w a -a -x b ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -w a -o -x b ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ ! -w a -o -x b ]
[root@localhost ~]# echo $?
1
字串比較
= 兩個字串相等。
!= 兩個字串不等。
-z 空串。
-n 非空串。
[root@localhost ~]# a=""
[root@localhost ~]# [ -z $a ]
[root@localhost ruby]# echo $?
0
[root@localhost ~]# a="123"
[root@localhost ~]# [ -z $a ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -n $a ]
[root@localhost ~]# echo $?
0
測試數值
-eq 數值相等。
-ne 數值不相等。
-gt 第一個數大於第二個數。
-lt 第一個數小於第二個數。
-le 第一個數小於等於第二個數。
-ge 第一個數大於等於第二個數。
[root@localhost ~]# [ "123" -eq "123" -a "123" -ge "100" ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# a=12
[root@localhost ~]# b=10
[root@localhost ~]# [ $a -gt $b ]
[root@localhost ~]# echo $?