Linux shell程序設(shè)計(jì)(六).控制結(jié)構(gòu)-1
?
??? 開(kāi)始進(jìn)入變成的實(shí)質(zhì)性部分——語(yǔ)句結(jié)構(gòu)。其中的if語(yǔ)句的復(fù)雜度超過(guò)了我的想象,特別是那幾個(gè)不同的種類,需要好好研究研究。
?
?
一、if語(yǔ)句
?
1、
測(cè)試語(yǔ)句條件
?
??? if 測(cè)試語(yǔ)句
??? then 命令1
??? else 命令2
??? fi
?
??? 舉例:
??? if test -f "$1"
??? then pr $1
??? elif test -d "$1"
??? then (cd $1 ; pr *)
??? else echo "$1 is neither a file nor a directory."
??? fi
??? 說(shuō)明:如果$1是一個(gè)普通文件名,則打印其內(nèi)容,如果$1是一個(gè)文件夾地址,則打印其下所有文件的內(nèi)容,如果均不是,則顯示錯(cuò)誤信息。
?
2、命令語(yǔ)句條件
?
??? 通常if語(yǔ)句都用test命令測(cè)試,但是也可以利用一般命令執(zhí)行成功與否來(lái)做判斷。
??? 如果執(zhí)行成功,則返回0,if條件為真;否則為假。
?
??? if 命令表1
??? then 命令表2
??? else 命令表3
??? fi
?
??? 舉例:
??? if
????? grep $user /etc/passwd > /tmp/null
????? who | grep $user
??? then
????? echo "$user has logged in the system."
????? cp /tmp/null tmp1
????? rm /tmp/null
??? else
????? echo "$user has not logged in the system."
??? fi
??? 說(shuō)明:如果輸入用戶已經(jīng)注冊(cè),則將信息寫入tmp1中,若未注冊(cè)則返回錯(cuò)誤信息。
?
?
二、條件測(cè)試
?
??? 條件測(cè)試有3中形式:
?
??? ① 用test命令 --test -f "$1"
??? ② 用[]括起來(lái)([]里面必須要有空格) --[ -f "$1"]
??? ③ 用[[條件表達(dá)式]]的格式
?
??? test命令可以和多種系統(tǒng)運(yùn)算符一起使用,主要包括以下幾類:
?
1、文件類測(cè)試
?
??? ① -r 文件名:文件存在且可讀,則返回true
??? ② -w 文件名:文件存在且可寫,則返回true
??? ③ -x 文件名:文件存在且可執(zhí)行,則返回true
??? ④ -f 文件名:文件存在且為普通文件,則返回true
??? ⑤ -d 文件名:文件存在且為目錄文件,則返回true
??? ⑥ -p 文件名:文件存在且為命名的FIFO文件,則返回true
??? ⑦ -b 文件名:文件存在且是塊設(shè)備文件,則返回true
??? ⑧ -c 文件名:文件存在且是字符設(shè)備文件,則返回true
??? ⑨ -s 文件名:文件存在且長(zhǎng)度大于0,則返回true
??? ⑩ -t 描述字:若文件被打開(kāi)且描述字與終端設(shè)備相關(guān),則返回true(默認(rèn)描述字為1)
?
2、字符串測(cè)試
?
??? ① -z s1:若字符串s1長(zhǎng)度為0,則返回true
??? ② -n s1:若字符串s1長(zhǎng)度大于0,則返回true
??? ③ s1:若字符串s1存在且部位空,則返回true
??? ④ s1 = s2:若s1、s2相等,則返回true(“=”可以用“==”代替,“=”前后必須有空格)
??? ⑤ s1 != s2:若s1、s2不相等,則返回true
??? ⑥ s1 < s2:若按字典順序s1在s2之前,則返回true
??? ⑦ s1 > s2:若按字典順序s1在s2之畫后,則返回true
3、數(shù)值測(cè)試
?
??? ① n1 -eq n2:若n1等于n2,則返回true
??? ② n1 -ne n2:若n1不等于n2,則返回true
??? ③ n1 -lt n2:若n1小于n2,則返回true
??? ④ n1 -le n2:若n1小于等于n2,則返回true
??? ⑤ n1 -gt n2:若n1大于n2,則返回true
??? ⑥ n1 -ge n2:若n1大于等于n2,則返回true
4、邏輯運(yùn)算符
?
??? 邏輯運(yùn)算符是用于將以上測(cè)試語(yǔ)句組合起來(lái)的符號(hào)
?
??? ① !:邏輯非,放在表達(dá)式的最前面,使表達(dá)式最終結(jié)果相反。
??? ② -a:邏輯與,放在兩個(gè)表達(dá)式之間 &&
??? ③ -o:邏輯或,放在兩個(gè)表達(dá)式之間 ||
??? ④ ():用于劃分邏輯運(yùn)算
??? 舉例:
??? [ ! -r $1 ]
??? !test -r "$1"
??? [ -f "$myfile" -a -r "$myfile" ]
??? [ "$a" -ge 0 -o "$b" -le 100 ]
??? [ \( "$a" -ge 0 -o "$b" -le 100 \) -a "$c" -eq 10 ]
?
??? 優(yōu)先級(jí):
??? 表達(dá)式 > () > ! > -a > -o
?
5、特殊條件測(cè)試
?
??? ① “:”:表示不做任何事情,退出值為0
??? ② true:表示總為真,退出值為0
??? ③ false:表示總為假,退出值為255
?
??? 舉例:
?
??? echo "Enter two numbers"
??? read x y
??? ((z=x+y))
??? if [[ z -gt 10 ]]
??? then
????? echo "x+y>10"
??? fi
??? ((x*=y))
??? ((z%=5))
??? if [[ x -le 100 || z -ne 0 ]]
??? then
????? echo "x*y<=100 or (x+y)%5!=0"
??? fi
??? echo "Your current directory is `pwd`"
??? echo "Enter a file name ->\c"
??? read name
??? if [[ -r $name && -f $name ]]
??? then
????? cat $name
??? elif [[ -d $name && -x $name ]]
??? then
????? cd $name
????? ls -l | wc -l
??? else
??? echo "Bad file name!"
??? fi
?
?
三、case語(yǔ)句
?
??? 語(yǔ)法格式為:
?
??? case 字符串 in????
??? s1) 命令??????????
??????? ...???????????
??????? 命令;;????????
??? s2) 命令??????????
??????? ...???????????
??????? 命令;;????????
??? s3) 命令??????????
??????? ...???????????
??????? 命令;;????????
??? esac??????????????
?
??? 舉例如下:
?
??? echo "Please chose either a,b or c"
??? echo "[a] print a file"
??? echo "[b] delete a file"
??? echo "[c] quit"
??? read response
??? case $response in
??? a) lp myfile;;
??? b) rm myfile;;
??? c) echo "Good bye";;
??? esac
?
??? 注意事項(xiàng):
?
??? ① 一個(gè)case可以跟多條命令,最后一個(gè)命令必須以“;;”結(jié)尾
??? ② 模式字符串可以使用通配符,例如“*)”
??? ③ 如果幾個(gè)case相同處理,則用“|”隔開(kāi),表示“或”的意思
??? ④ 各個(gè)case之間不能重復(fù),且需要考慮先后位置
??? ⑤ 以case關(guān)鍵字開(kāi)頭,以esac關(guān)鍵字結(jié)尾
??? ⑥ case的退出值是最后一個(gè)命令執(zhí)行的退出值,如未執(zhí)行任何命令,則退出值為0
?
?