過了2周,終於學到shell cripte的編寫了,回頭看看鳥哥的菜已經吃完一半,還是略有成就感的,不過想想自己學了些什么,不知為什么也列舉不出來太多。不管怎么說,現在Linux也算從零走到入門了吧,之后打算好好研究下Linux內核和Linux C編程,搞幾個小項目深入下,有需要再看看系統管理什么的。廢話不多說了,把今天看shell script的筆記整理出來吧。
編寫shell script的良好習慣
1.文件頭處記錄
1.script的功能;
2.script的版本;
3.script的作者與聯絡方式;
4.script的歷史記錄;
5.script內較特殊的命令,最好使用“絕對路徑”的方式來執行;
6.script執行時需要的環境變量預先生命與設置。
同時,根其他編碼一樣,添加適當的注釋,整齊的縮進排版都是很重要的。
2.簡單的范例:
從Hello World開始~

第一行:#!聲明你所使用的shell名稱:這個還是比較重要的,這樣系統就能夠加載bash的相關環境配置文件(一般來說就是non-login shell的~/.bashrc)
#作為注釋的前綴,自我覺得這注釋的顏色挺好看的哈。
在程序的開頭,最好對主要的環境變量進行聲明,比如PATH和LANG等是比較重要的2個,方便程序直接執行命令,而不必寫絕對路徑。
shell中的變量
1.變量的顯示與設置:
echo $LANG 顯示各種變量
1.使用等號對變量進行賦值:
EG:name=abc 自定義變量 echo $name 輸出結果:abc
2.等號右邊不能直接根空格符,且變量名稱必須是英文字符與數字,不能數字開頭(都比較基本啦)
3.變量內容若又空格等字符可使用雙引號“”,單引號''將變量內容結合起來:
A.雙引號中的特殊字符如$等,可以保有原本的特性:
eg:name= "$name its me" 輸出變量原來的值 echo $name 輸出結果:abc its me
B.單引號內的特殊字符作為一般文本字符原樣輸出:
eg:name= ' $name its me' 原樣輸出' '中的內容 echo $name 輸出結果: $name its me
4.可以使用 \ 將特殊字符轉換為普通字符([Enter] $ \ 空格 !等)
5. 增加變量內容:(讀取變量值)
eg: name="$name"yes或者 name=${name}yes (推薦) echo $name 輸出結果:abcyes
6.若要在等號右邊調用命令輸出:
eg: version = $(命令名稱) version=$( uname -r )
7.若需要在其他子進程中也是使用該變量,需要使用export將該變量聲明為環境變量
8.通常大寫字符為系統默認變量。
9.取消變量的方法: unset 變量名稱 unset name
2.環境變量的功能:
列出目前shell環境下的所有環境變量與其內容: env
列出所有的變量(環境變量與自定義變量):set
$(關於本shell的PID) 使用echo $就可以獲得本線程的PID號碼
?(關於上個執行命令的回傳碼)如果成功執行,回傳0;如果執行發生錯誤,會回傳“錯誤代碼”
將自定義變量聲明為環境變量:export 變量名稱
影響現實結果的語系變量:
locale (本機目前設置)locale -a (系統所支持的全部語系)
3.變量鍵盤讀取,數組與聲明:
1.鍵盤讀取:read [-pt] variable;
-p:寧可以接提示符 eg: read -p "Please input your name" name;
-t:接等待的秒數 eg: read -t 30 name。
2.變量的聲明: declare [-aixr] variable
-a:將后面變量聲明為數組類型;
-i:將變量聲明為整型;
-x:將變量聲明為環境變量;
-r:將變量聲明為readonly類型,該變量不可悲更改內容,也不能重設。
變量類型默認為字符串;如果不小心把變量聲明為只讀,必須注銷才登陸才能復原。
3.數組的聲明: var[index]=content
eg:var[1]="small min"
var[2]="big min"
var[3]="nice min"
echo "${var[1]}, ${var[2]}, ${var[3]}"
4.變量內容的刪除,替代和替換
| 變量設置方式 | 說 明 |
| ${變量#關鍵字} | 若變量內容從頭開始的數據符合“關鍵字”,則將符合的最短數據刪除 (刪除第一個) |
| ${變量##關鍵字} | 若變量內容從頭開始的數據符合“關鍵字”,則將符合的最長數據刪除(剩下最后1個) |
| ${變量%關鍵字} | 從尾向前的數據符合“關鍵字”,則將符合的最短數據刪除(刪除第一個) |
| ${變量%關鍵字} | 從尾向前的數據符合“關鍵字”,則將符合的最長數據刪除(剩下最前面的一個) |
| ${變量/舊字符串/新字符串} | 變量內容符合舊字符串,第一個舊字符串替換為新字符串 |
| ${變量//就字符串/新字符串} | 變量內容符合就字符串,所有的都替換為新字符串 |
變量的測試與替換方式
| 變量設置方式 | str沒有設置 | str為空字符串 | str為非空字符串 |
| var=${str-haha} | var=haha | var= | var=$str |
| var=${str:-haha} | var=haha | var=haha | var=$str |
| var=${str+haha} | var= | var=haha | var=haha |
| var=${str:+haha} | var= | var= | var=haha |
| var=${str=haha} | var=str=haha | var=str= | str不變 var=$str |
| var=${str:=haha} | var=str=haha | var=str=haha | str不變 var=$str |
| var=${str?haha} | error | var= | var=$str |
| var=${str:?haha} | error | error | var=$str |
5.命令別名與歷史命令
命令別名設置:alias, unalias(很簡單)
eg: alias name='wolegequ' alias c='cal'
歷史命令: history [n] [-c] [-raw] histfiles
n:列出最近的n條命令
-c:清楚目前shell中的所有內容
-a:將新增命令加入histfiles,若沒有該文件,默認寫入~/.bash_history
-r: read -w:write
echo $HISTSIZE 顯示history的大小
!!執行上一條命令,!number 執行第幾條命令
#:最終命令寫入histfile的問題,只有最后注銷的那個bash才回寫入~/.bash_history

本作品由vortex.zhu創作
采用知識共享署名-非商業性使用-禁止演繹 2.5 中國大陸許可協議進行許可。
基於www.cnblogs.com上的作品創作。
Permissions beyond the scope of this license may be available at http://www.cnblogs.com/VortexPiggy/.
