TEST
條件測試語句經常會被腳本中的控制結構所調用,常用命令有兩個,test和expr,有時我們甚至都不知道自己在使用test,這是因為test有兩種結構,一種是常規的
$test condition
另一種比較常用的表達式為
[ condition ]
中括號和condition之間一定要有空格
test主要用途是對字符串、整數以及文件進行條件判斷,對于判斷結果可以通過
$echo $?
來查看,返回結果為0則表示真,為1則表示假,為2則表示參數不正確
特殊變量列表
$0 正在被執行命令的名字。對于shell腳本而言,這是被激活命令的路徑
$n 該變量與腳本被激活時所帶的參數相對應。n是正整數,與參數位置相對應($1,$2...)
$# 提供腳本的參數數量
$* 所有這些參數都被雙引號引住。若一個腳本接收兩個參數,$*等于$1$2
$@ 所有這些參數都分別被雙引號引住。若一個腳本接收到兩個參數,$@等價于$1 $2
上面這兩個的區別不是很清楚,雖然表達的很明確,但是應用中的區別沒有很好的例子,多數是用在for中對當前所輸入參數進行循環,注意$1和$2之間存在一個空格
$? 前一個命令執行后的退出狀態
$$ 當前shell的進程號。對于shell腳本,這是其正在
執行時的進程ID
$! 前一個后臺命令的進程號
test操作字符串
string
-z string 若string長度為0,則為真
-n string 若string長度不為0,則為真
string1 = string2 若兩個字符串相等,則為真
string1 != string2 若兩個字符串不相等,則為真
test操作整數
integer
int1 -eq(ual) int2 若int1等于int2,則為真
int1 -ne int2 若int1不等于int2,則為真
int1 -lt int2 若int1小于int2,則為真
int1 -le int2 若int1小于等于int2,則為真
int1 -gt int2 若int1大于int2,則為真
int1 -ge int2 若int1大于等于int2,則為真
test操作文件
file
相同: -ef 索引節點號相同
新 : -nt modified date
舊 : -ot modified date
-b : 塊設備
-c : 字符設備
-d : 目錄
-f : 規則文件
-e : 文件存在
-r : 文件可讀
-w : 文件可寫
-x : 文件可執行
-h -L: link文件
-s : 文件存在并且大小大于0
-S : 文件存在并且是個socket
-p : 文件存在并且是個named pipe
-G : 文件存在并且設置了有效的gid
-O : 文件存在并且設置了有效的uid
-g : 文件存在并且設置了sgid
-u : 文件存在并且設置了suid
-k : 文件存在并且設置了粘滯位
-t : 文件描述符
在使用時如果涉及到變量的引用,最好加上"",否則在字符串為空的情況下會出現異常情況
舉例說明
$ a=1 + a=1
$ b=2 + b=2
$ [ -z $a -o -z $b ]
$ echo $? + echo 1
1
$ b= + b=
$ [ -z "$a" -o -z "$b"
$ echo $? + echo 0
0
$ [ -z $a -o -z $b ]
-bash: [: argument expected
$ echo $? + echo 2
2
邏輯操作符
-a :邏輯與,操作符兩邊均為真,結果為真,否則為假。
-o :邏輯或,操作符兩邊一邊為真,結果為真,否則為假。
!:邏輯否,條件為假,結果為真。
EXPR
expr命令一般用于整數值,但也可用于字符串的計算,使用方法如下
以下出現的所有\字符皆為轉意符號,防止shell擴展
expr ARG1 \| ARG2 ARG1不是空值或0值的話返回ARG1,否則返回ARG2
expr ARG1 \& ARG2 如果兩個表達式都不是空值或者0值返回ARG1,否則返回0
比較運算:ARG1 <,>,<=,>=,=,!= ARG2 其中<,>,<=,>=運算都必須加\防止shell擴展
需要注意的一點是expr的結果與命令的狀態返回值恰恰相反,即判斷結果為真時返回1,為假時返回0,如
$ expr 1 = 1
1
$ echo $?
0
數值運算:ARG1 +,-,*,/,% ARG2 其中*需要加\
STRING : REGEXP 將STRING中的字符串與正則表達式進行比較,返回匹配的字符個數,沒有匹配返回0,當REGEXP中包含子表達式時\(...\)時,返回包含實際匹配的字符串
eg:
$VALUE=accounts.doc
$expr "$VALUE" : ".*"
12
$expr "$VALUE" : "\(.*\).doc"
accounts
match STRING REGEXP 與STRING:REGEXP相同
substr STRING POS LENGTH字符串截取,截取STRING的第POS個字符開始,長度為length的字符串
$expr substr "Goodnight Ladies" 11 6
Ladies
index STRING CHARS 返回STRING中的包含CHARS中的第一個字符位置,如果沒有則返回0
$expr index abcdef de
4
$expr index abcdef fd
4
length STRING 計算字符串的長度
$echo $VALUE
accounts.doc
$expr length "$VALUE"
12
在使用時如果涉及到shell變量,建議要用“”括起來,否則空串會有問題
如上面最后的例子
$VALUE=
$expr length $VALUE
expr: syntax error
當然在極特殊的時候即使加上""仍然有問題,如在某些系統中(我用于測試的RHAS4沒有該問題,僅作記錄)
$STR="="
$expr "$STR" = "="
此時就會報語法錯誤,一旦shell變量的值與 expr運算符中的一個相同,這種情況就會發生。避免這種問題的方法是,將該表達式寫成:
$expr "x$STR" = "x="即可