隨著腳本變得越來越復(fù)雜我衬,當(dāng)腳本運行錯誤,執(zhí)行結(jié)果出人意料的時候, 我們就應(yīng)該查看一下原因了饰恕。
1.語法錯誤
一個普通的錯誤類型是語法挠羔。語法錯誤涉及到一些shell 語法元素的拼寫錯誤。大多數(shù)情況下埋嵌,這類錯誤會導(dǎo)致shell 拒絕執(zhí)行此腳本破加。
a.丟失引號
b.丟失或意外的標(biāo)記
c.預(yù)料不到的展開
2.邏輯錯誤
不同于語法錯誤,邏輯錯誤不會阻止腳本執(zhí)行雹嗦。雖然腳本會正常運行范舀,但是它不會產(chǎn)生期
望的結(jié)果,歸咎于腳本的邏輯問題了罪。
a.不正確的條件表達(dá)式锭环。很容易編寫一個錯誤的if/then/else 語句,并且執(zhí)行錯誤的邏輯泊藕。有時候邏輯會被顛倒辅辩,或者是邏輯結(jié)構(gòu)不完整。
b.“超出一個值”錯誤娃圆。當(dāng)編寫帶有計數(shù)器的循環(huán)語句的時候玫锋,為了計數(shù)在恰當(dāng)?shù)狞c結(jié)束,循環(huán)語句可能要求從0 開始計數(shù)讼呢,而不是從1 開始撩鹿,這有可能會被忽視。這些類型的錯誤要不導(dǎo)致循環(huán)計數(shù)太多悦屏,而“超出范圍”节沦,要不就是過早的結(jié)束了一次迭代,從而錯過了最后一次迭代循
c.意外情況础爬。大多數(shù)邏輯錯誤來自于程序碰到了程序員沒有預(yù)見到的數(shù)據(jù)或者情況散劫。這也可以包括出乎意料的展開,比如說一個包含嵌入式空格的文件名展開成多個命令參數(shù)而不是單個的文件名幕帆。
因此,當(dāng)編程的時候赖条,驗證假設(shè)非常重要失乾。這意味著要仔細(xì)得計算腳本所使用的程序和命令的退出狀態(tài)常熙。首先檢查一個名字,看看它是否為一個真正存在的目錄碱茁,另一個是cd
命令是否執(zhí)行成功裸卫。如果任一種情況失敗,就會發(fā)送一個錯誤說明信息到標(biāo)準(zhǔn)錯誤纽竣,然后腳本終止執(zhí)行墓贿。
另外,在各類軟件開發(fā)中(包括腳本)蜓氨,測試是一個重要的環(huán)節(jié)聋袋。通過執(zhí)行每一個測試條件,就達(dá)到了一個良好的測試覆蓋率穴吹。如dir name 包含一個已經(jīng)存在的目錄的名字
dir name 包含一個不存在的目錄的名字dir name 為空幽勒。測試也是一個時間的函數(shù)。不是每一個腳本功能都需要做大量的測試港令。問題關(guān)鍵是確定什么功能是最重要的啥容。因為測試若發(fā)生故障會存在如此潛在的破壞性,所以代碼片在設(shè)計和測試段期間都應(yīng)值得仔細(xì)推敲顷霹。
如果測試暴露了腳本中的一個問題咪惠,那下一步就是調(diào)試了。找到問題區(qū)域淋淀,追蹤遥昧,執(zhí)行時檢查數(shù)值,完善腳本绅喉。