每乙個在unix/linux上工作的程式設計師可能都擅長shell指令碼程式設計。但大家解決問題的方式卻不盡相同,這要取決於對專業知識的掌握程度、使用命令的種類、看待問題的方式等等。對於那些處在shell指令碼程式設計初級階段的程式設計師來說,遵循一些恰當的做法可以幫助你更快、更好的學習這些程式設計技巧。下面,我們就來討論這些能幫助你學習shell指令碼程式設計的方法吧。
1.多動手
你想學習shell指令碼程式設計,這很不錯。於是你拿了一本書開始學習。一些人會首先通讀整本教材後再上機練習。這種方法可能適用於一些人,但我卻不太看好它。我的建議是,僅僅學一些最基礎的能夠讓你開始編碼的知識就可以了。之後,動手寫一些簡單的程式吧。一旦你由於知識上的欠缺而不得不停止時,再回到書本上去讀你想要了解的那部分,然後繼續做你的專案。如此周而復始,不斷提高你的水平。這種邊學邊做的方法曾讓我受益良多。
2.善用命令提示符
有時候,我們寫的指令碼中有一些錯誤。我們修改錯誤,執行指令碼,但系統再次報錯。並且這個改錯報錯的過程可能會發生很多次。碰到這些情況,首先需要找到有問題的行或命令,這可以通過一些除錯語句來輕鬆做到。一旦發現這條語句,嘗試在命令提示符下執行相同的語句。如果它在命令提示符下開始正常執行,你就可以容易的推斷出它不能正常執行的原因了。可能是由於某些錯誤輸入的命令,或者是某些環境變數不匹配,或者是從不同的地方引用了某個二進位制檔案等等。這種方法會讓除錯變得簡單易行。
3.考慮問題要全面
現在我們來看個問題。你想到了關於某個問題的解決方案,但這個解決方案只適用於處理小型檔案。可是當處理比較大的檔案時,你該怎麼辦?舉個例子,我們想要得到乙個檔案的第一行內容:
sed -n '1p' file這條語句當然會給出你想要的第一行內容。可是如果處理的檔案包含上百萬條記錄呢?儘管上面的那條sed命令可以輸出檔案的第一行內容,但是想要處理大型檔案一定會帶來效能上的問題。
解決辦法:
sed -n '1p;1q' file這條命令將只輸出第一行,同時退出程式。
4.經常嘗試不同的方法
你在寫指令碼時碰到乙個問題,然後你找到了一種獨特的解決方法。下一次你偶然又碰到類似的問題,這時,不要再用以前你用過的方法來解決。試試另外一種方法吧。如果某一天再次遇到這種情況,再試試其它方法。
例如:
if [ $? -eq 0 ]另一種方法:then
echo "success"
fi
[ $? -eq 0 ] && echo "success"現在你可能會明白這個部落格裡會有那麼多以「……的不同解決方法」為題的文章了吧。所有這些文章的目的都是用來幫助訂閱這個部落格的開發者開闊視野,開啟思路。
5.快速編碼
指令碼可以節省我們的時間,提高生產力。可是,難道我們花在寫指令碼和測試上的時間還少嗎?我們想寫乙個指令碼,於是開啟乙個檔案,寫下**,儲存檔案,之後執行指令碼,系統報錯,我們再開啟檔案修改、儲存、執行……在這個過程中會花費很多時間。在此前的一篇題為《如何快速寫shell指令碼》的文章裡,你可以學會如何編寫指令碼和測試正在執行中的指令碼,而不用再回顧命令提示符。這些方法可以加快編碼的速度。當我寫指令碼的時候,我總是使用這些方法。而且我可以很肯定的說,它們幫我節約了不少時間。
6.經常使用內部命令
無論碰到哪種情況,請盡量考慮使用內部命令而不是外部命令。在此前的一篇題為《內部命令和外部命令》的文章裡,我們可以看到二者間的差異。用內部命令對你永遠都有好處。根據正在處理的輸入檔案的大小,內部命令可以在效能方面為你節省很多。雖然你並不總是有這樣選擇內部命令抑或外部命令的機會,但在某些情況下,你一定能做出正確的選擇。
7.沒有必要使用cat命令
這是我們經常在論壇裡討論的話題之一。沒有必要使用cat命令指的是在有些時候,我們會發現根本沒有必要使用cat命令。有時候,使用了多餘的cat命令會讓你的**看起來很醜陋,而且還會帶來效能上的問題。
例如:
$ cat /etc/passwd | grep guru正確的方法應該是:
$ grep guru /etc/passwd8.仔細閱讀錯誤資訊
程式設計師常犯的乙個錯誤是:當我們敲入的命令報錯後,我們中的大多數人只是對錯誤資訊一瞥而過,而不會去認真的讀一讀。很多時候,錯誤資訊裡就包含了解決辦法。更重要的是,有時候我們修改了某個錯誤並再次執行後,系統依舊會報錯。然後我們再次修改,但系統再次報錯。這可能會持續很長時間。但實際上,舊的錯誤可能已經被糾正,只是由於出現了其它一些新錯誤才導致系統再次報錯。而我們依舊在懷疑為什麼修改好的**依然不能正常執行。因此,請你養成仔細閱讀錯誤資訊的習慣。
9.盡量避免臃腫的命令
你正在嘗試去從乙個大的檔案中篩選某條資訊。接下來你可能寫一大堆命令來實現這一功能。可是,儘管你將得到正確的結果,你寫的命令卻不夠好,且晦澀難懂。因此,我們應該盡量避免這種情況發生。下面這個例子就是**優化的好例子。
例如:檢索使用者id值為502的使用者名稱。
下面的命令不好:
$ grep 502 /etc/passwd | cut -d: -f1這條命令也不夠好:
$ grep 502 /etc/passwd | awk -f":" ''這才是一條好的命令:
$ awk -f":" '$正如以上示例,用一條簡單的awk命令就可以完成檢索任務。3==502' /etc/passwd
10.別吝嗇新增注釋
你寫了乙份指令碼。一兩個星期後,你再次開啟指令碼檔案,如果沒有注釋在裡面的話,你可能會花上很多時間才能理解這些**。雖然**是我們自己寫的,但這依舊會浪費我們很多的時間。指令碼是用來節省時間的,因此,我們沒有理由浪費時間去理解這些用來節省時間的檔案。所以,請養成在指令碼中新增注釋的好習慣。這些注釋不必很詳細,能讓自己或別人讀懂就行。
文章出自:unix-school
譯文出自:iteye
關於 shell 指令碼程式設計的10 個最佳實踐
每乙個在unix linux上工作的程式設計師可能都擅長shell指令碼程式設計。但大家解決問題的方式卻不盡相同,這要取決於對專業知識的掌握程度 使用命令的種類 看待問題的方式等等。對於那些處在shell指令碼程式設計初級階段的程式設計師來說,遵循一些恰當的做法可以幫助你更快 更好的學習這些程式設計...
關於 shell 指令碼程式設計的10 個最佳實踐
每乙個在unix linux上工作的程式設計師可能都擅長shell指令碼程式設計。但大家解決問題的方式卻不盡相同,這要取決於對專業知識的掌握程度 使用命令的種類 看待問題的方式等等。對於那些處在shell指令碼程式設計初級階段的程式設計師來說,遵循一些恰當的做法可以幫助你更快 更好的學習這些程式設計...
關於 shell 指令碼程式設計的10 個最佳實踐
每乙個在unix linux上工作的程式設計師可能都擅長shell指令碼程式設計。但大家解決問題的方式卻不盡相同,這要取決於對專業知識的掌握程度 使用命令的種類 看待問題的方式等等。對於那些處在shell指令碼程式設計初級階段的程式設計師來說,遵循一些恰當的做法可以幫助你更快 更好的學習這些程式設計...