【test 指令】
test 指令是 shell 的内部指令,用于計算作為其參數的表達式是真還是假。 如果表達式為真,則 test 傳回0(注意與 c 語言 0 表示 false 不同),如果表達式為假,傳回非 0 。
shell 提供了另外一個調用 test 指令的方式,就是用方括号 [ ] 來代替單詞 test 。
調用 test 指令的格式為:
<a href="http://my.oschina.net/moooofly/blog/170629#">?</a>
1
2
<code>test</code> <code>expr1 opr expr2 或是 [ expr1 opr expr2 ]</code>
<code>test</code> <code>opr expr1 或是 [ opr expr1 ]</code>
(注意方括号與表達式之間的空格必須存在)
【邏輯運算符】
-a expr1 -a expr2 邏輯與
-o expr1 -o expr2 邏輯或
! !expr1 邏輯非
【數值判斷】
-eq if [ "$a" -eq "$b" ] 是否相等
-ne if [ "$a" -ne "$b" ] 是否不相等
-gt if [ "$a" -gt "$b" ] 是否大于
-ge if [ "$a" -ge "$b" ] 是否大于等于
-lt if [ "$a" -lt "$b" ] 是否小于
-le if [ "$a" -le "$b" ] 是否小于等于
< (("$a" < "$b")) 小于(需要雙括号)
<= (("$a" <= "$b")) 小于等于(需要雙括号)
> (("$a" > "$b")) 大于(需要雙括号)
>= (("$a" >= "$b")) 大于等于(需要雙括号)
【字元串判斷】
= if [ "$a" = "$b" ] 字元串是否相等
!= if [ "$a" != "$b" ] 字元串是否不等
-n if [ -n str1 ] 字元串長度是否不等于 0
-z if [ -z str2 ] 字元串長度是否等于 0
== if [ "$a" == "$b" ] 與 = 等價(但有例外)。
【檔案判斷】
-b file 若檔案存在且是一個塊特殊檔案
-c file 若檔案存在且是一個字元特殊檔案
-d file 若檔案存在且是一個目錄
-e file 若檔案存在
-f file 若檔案存在且是一個規則檔案(普通檔案)
-g file 若檔案存在且設定了sgid位的值
-h file 若檔案存在且為一個符合連結
-k file 若檔案存在且設定了”sticky”位的值
-p file 若檔案存在且為一已命名管道
-r file 若檔案存在且可讀
-s file 若檔案存在且其大小大于零
-u file 若檔案存在且設定了suid位
-w file 若檔案存在且可寫
-x file 若檔案存在且可執行
-o file 若檔案存在且被有效使用者id所擁有
【指令行參數/位置變量】
$0 腳本的名字
$1, $2, ..., $9 腳本第 1 個到第 9 個指令行參數
$# 指令行參數的個數
$@ 或是 $* 所有指令行參數
$? 最後一條指令的退出狀态
$$ 正在執行程序的 id(pid)
給位置變量指派:
3
4
<code>[root@betty ~]</code><code># set one two tree</code>
<code>[root@betty ~]</code><code># echo $1 $2 $3</code>
<code>one two tree</code>
<code>[root@betty ~]</code><code>#</code>
【shift 指令】
這條指令可以對位置參數進行移動,每次調用都會導緻:$1=$2、$2=$3、$3=$4....
以下代碼可以列印出所有的參數
5
<code>while</code> <code>[ -n</code><code>"$1"</code> <code>]</code>
<code>do</code>
<code> </code><code>echo</code> <code>$1</code>
<code> </code><code>shift</code>
<code>done</code>
【變量替換(指派)】
shell 提供了變量替換功能,使使用者能夠檢查變量的值,并根據選項改變它的值。
$variable 儲存在 variable 中的值
${variable} 儲存在 variable 中的值
${variable:-string} 如果 variable 的值非空,則值為 variable,否則值為 string
${variable:+string} 如果 variable 的值非空,則值為 string,否則值為空
${variable:=string} 如果 variable 的值非空,則值為 variable,否則值為 string 且 variable 的值設定為string
${variable:?string} 如果 variable 的值非空,則值為 variable,否則顯示 string 并退出
【正則表達中的特殊字元】
行末:$
行首:^
空格:\s
行末空格:\s\+$
行首空格:^\+\s
【注】
當在對變量進行判斷時最好将變量用雙引号括起來,這樣可以避免參數包含空格或是 tab 帶來的問題。如 " $home"、"$#" 等。
使用 [ expr ] 進行判定時,expr與 [ 及 ] 之間均必須有空格。
== 的功能在 [[ ]] 和 [] 中的行為是不同的 , 這個操作符将在 [[ ]] 結構中使用模式比對 。 如下:
[[ $a == z* ]] # 如果 $a 以 "z" 開頭(模式比對)那麼将為 true
[[ $a == "z*" ]] # 如果 $a 等于 "z*" (字元比對),那麼結果為 true
[ $a == z* ] # file globbing 和 word splitting 将會發生
[ "$a" == "z*" ] # 如果 $a 等于 z* (字元比對),那麼結果為 true