看完了書《shell指令碼學習指南》,順便總結一下:
看了整本書,全部都是命令,但也確實很難記得命令的選項,所以學習方法就變了。
學習嘛,要考慮到遺忘的可能,既然會忘,還不如不去記,能做的就是但用到的時候再去學,那麼現在學習的目的就是為了縮短以後用到時再去學習的學習時間,所以現在所應該學的,是將書本上的命令記住,選項則查手冊頁(man),也需要記住一些常用的選項,現在要做的就是熟悉手冊頁,懂得標準化,命令是在不斷公升級的,手冊頁才是包含了最全部的命令的參考,沒人會規定你在linux系統行輸入命令行時,不准檢視手冊頁,不過看英文確實是件痛苦的事。第二,就是猜測,比如在使用過程中,碰到乙個應用,好像沒學過,這是要猜測其最可能會作為哪條命令的選項出現的,然後去查對應的手冊,學完shell指令碼這本書,最多也就熟悉這些命令的大概50%的選項,其他不熟悉的選項肯定要猜測和查手冊的。
每個人的記憶力有所不同,最少應該記住每個命令是做什麼的,最大是記住命令的每個選項。
學完shell指令碼要將shell指令碼當做乙個程式來看到,而不僅僅只是乙個指令碼,作為程式是可以被程序內exec函式族呼叫執行的,這樣指令碼和c語言就互通了,可以相互呼叫。
shell指令碼作為程式,要有完備的選項處理機制(case,getopts),訊號處理機制(trap),輸入和輸出介面(read,printf),shell的執行環境(環境變數處理),shell的安全性考慮。
進行全域性性的考慮之後,才能進入具體的內部設計。
shell內部最難理解的,也最容易讓人犯錯的,應該是引用,雙引號引用,單引號引用,不帶引號的引用,搞清楚shell的內部執行機理還是非常重要的
理解清楚此圖,就算理解shell的執行機理了,雙引號內部只做變數替換、命令替換、算術表示式替換,單引號內部則什麼也不做,不帶引號的還要進行token分割,波浪號展開,萬用字元展開,看到這個圖就應該能明白awk的程式部分為什麼加單引號了,sed的命令部分為什麼加單引號了,為什麼有些命令要加eval重新執行一遍了。
另外,碰到不懂shell內部執**況的,可以使用trace類(strace)的命令跟蹤一下系統呼叫:strace -f sh 這樣啟動乙個shell,在此shell內執行你不理解的命令,並跟蹤子程序的所有系統呼叫的執**況,這個碰到問題時的乙個解決辦法。
sort,sed,awk,find,正則,這幾個是必須要熟練使用的,尤其是awk中的關聯陣列,就是雜湊表,c++中的關聯物件,處理字串是極其方便的。
最後,我不得不說,shell的啟動,會呼叫兩個指令碼檔案:
test -r /etc/profile && . /etc/profile
test -r $home/.profile && . $home/.profile
我在工作中就碰到過需要定製不同的shell啟動情況的,可以修改$home/.profile
Shell指令碼學習總結
最近一段時間研究語音識別 automatic speech recognition,asr 接觸到一款優秀的asr開源專案kaldi。學習過程中,發現kaldi大部分指令碼採用shell語音編寫,所以潛心學習了一段時間的shell程式設計。總體來說,該語言難度一般,關鍵要記住眾多的命令,採用思維導圖...
shell指令碼總結
1.定義變數 1 變數名和等號之間不能有空格。2 使用乙個定義過的變數,只要在變數名前面加美元符號 即可,變數名外面的花括號是可選的,加不加都行,加花括號是為了幫助直譯器識別變數的邊界.特殊變數列表 變數 含義 0 當前指令碼的檔名 n 傳遞給指令碼或函式的引數。n 是乙個數字,表示第幾個引數。例如...
shell指令碼總結
最近在專案中用到shell指令碼來執行命令,發現公司周圍都不會寫shell指令碼 shell是使用者和linux作業系統之間的介面。類似windows系統的dos命令列。linux中有多種shell,其中預設使用的是bash。但是如果使用到互動式輸入密碼的需要使用expect來執行,詳見 sh和ba...