歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> linux shell編程指南第十七章------條件測試

linux shell編程指南第十七章------條件測試

日期:2017/3/1 13:51:22   编辑:SHELL編程
寫腳本時,有時要判斷字符串是否相等,可能還要檢查文件狀態或是數字測試。基於這
些測試才能做進一步動作。Te s t命令用於測試字符串,文件狀態和數字,也很適合於下一章將
提到的i f、t h e n、e l s e條件結構。
本章內容有:
? 對文件、字符串和數字使用t e s t命令。
? 對數字和字符串使用e x p r命令。
e x p r命令測試和執行數值輸出。使用最後退出狀態命令$ ?可測知t e s t和e x p r,二者均以0表

示正確,1表示返回錯誤。

e s t一般有兩種格式,即:
test condition

[ c o n d i t i o n ]
使用方括號時,要注意在條件兩邊加上空格。
測試文件狀態的條件表達式很多,但是最常用的可在表1 7 - 1中查到。

表17-1 文件狀態測試
- d 目錄 - s 文件長度大於0、非空
- f 正規文件 - w 可寫
- L 符號連接 - u 文件有s u i d位設置
- r 可讀 - x 可執行

使用兩種方法測試文件s c o r e s . t x t是否可寫並用最後退出狀態測試是否成功。記住, 0表示
成功,其他為失敗。

[root@localhost huangcd]# ls -l ok.txt
-rw-r--r-- 1 root root 30 12-03 00:21 ok.txt
[root@localhost huangcd]# [ -w ok.txt ]
[root@localhost huangcd]# echo $?
0

[root@localhost huangcd]# [ -x ok.txt ]
[root@localhost huangcd]# echo $?
1 //不可執行

下面的例子測試是否存在a p p s b i n目錄:
[root@localhost huangcd]# [ -d appsbin ]
[root@localhost huangcd]# echo $?
1

測試文件權限是否設置了s u i d位:

[root@localhost huangcd]# [ -u ok.txt ]
[root@localhost huangcd]# echo $?
1

測試文件狀態是否為O K,但是有時要比較兩個文件狀態。s h e l l提供三種邏輯操作完成此
功能。
-a 邏輯與,操作符兩邊均為真,結果為真,否則為假。
-o 邏輯或,操作符兩邊一邊為真,結果為真,否則為假。
! 邏輯否,條件為假,結果為真。

下面的例子測試兩個文件是否均可讀。

[root@localhost huangcd]# [ -r ok.txt -a -r sed.out ]
[root@localhost huangcd]# echo $?
0

字符串測試是錯誤捕獲很重要的一部分,特別在測試用戶輸入或比較變量時尤為重要。
字符串測試有5種格式。

test "string"

test str_op "string"

test "string" str_op "string"

[ str_op string ]

[ string str_op string ]

這裡,s t r i n g o p e r a t o r可為:
= 兩個字符串相等。
!= 兩個字符串不等。
-z 空串。
-n 非空串。

要測試環境變量E D I TO R是否為空:

[root@localhost huangcd]# [ -z $EDITOR ]
[root@localhost huangcd]# echo $?
0 //是空的

取值是否是v i?

[root@localhost huangcd]# [ $EDITOR="vi" ]
[root@localhost huangcd]# echo $?
0

測試TAPE盒TAPE2是否相等。

[root@localhost huangcd]# TAPE="/dev/rmt0"
[root@localhost huangcd]# TAPE2="/dev/rmt1"

[root@localhost huangcd]# [ "$TAPE" = "$TAPE2" ]
[root@localhost huangcd]# echo $?
1 //不相等

測試數值可以使用許多操作符,一般格式如下:
" n u m b e r " n u m e r i c o p e r a t o r " n u m b e r "
或者
[ " n u m b e r " n u m e r i c o p e r a t o r " n u m b e r " ]
n u m e r i c o p e r a t o r可為:
-eq 數值相等。
-ne 數值不相等。
-gt 第一個數大於第二個數。
-lt 第一個數小於第二個數。
-le 第一個數小於等於第二個數。
-ge 第一個數大於等於第二個數。

[root@localhost huangcd]# number=130
[root@localhost huangcd]# "$number" -eq "100"
bash: 130: command not found
[root@localhost huangcd]# [ "$number" -eq "130" ]
[root@localhost huangcd]# echo $?
0
[root@localhost huangcd]# [ "$number" -gt "100" ] //是否大於
[root@localhost huangcd]# echo $?
0

e x p r命令一般用於整數值,但也可用於字符串。一般格式為:
expr argument operator argument
e x p r也是一個手工命令行計數器。

[root@localhost huangcd]# expr 10+10
10+10
[root@localhost huangcd]# expr 10 + 10
20
[root@localhost huangcd]# expr 30 / 3
10
使用乘號時,必須用反斜線屏蔽其特定含義。因為s h e l l可能會誤解顯示星號的意義。

[root@localhost huangcd]# expr 30 \* 3
90

e x p r在循環中用於增量計算。首先,循環初始化為0,然後循環值加1,反引號的用法意
即替代命令。最基本的一種是從( e x p r)命令接受輸出並將之放入循環變量。

[root@localhost huangcd]# LOOP=0
[root@localhost huangcd]# LOOP=`expr $LOOP + 1`
[root@localhost huangcd]# echo LOOP
LOOP
[root@localhost huangcd]# echo $LOOP
1
[root@localhost huangcd]# LOOP=`expr $LOOP + 1`
[root@localhost huangcd]# echo $LOOP
2

e x p r也可以返回其本身的退出狀態,不幸的是返回值與系統最後退出命令剛好相反,成
功返回1,任何其他值為無效或錯誤。下面的例子測試兩個字符串是否相等,這裡字符串為
“h e l l o”和“h e l l o”。

本章涉及e x p r和t e s t基本功能,講到了怎樣進行文件狀態測試和字符串賦值,使用其他的
條件表達式如if then else和c a s e可以進行更廣范圍的測試及對測試結果采取一些動作。

Copyright © Linux教程網 All Rights Reserved