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