0 腳本語言作用
腳本對於系統運維人員來說就是生產工具,它代表了維護工作的生產力。unix類的系統裡腳本得到相當好的發展,windows為了在服務器領域有所突破,也提供了powershell這樣的腳本引擎。
腳本在分析日志、批量修改、自動處理等領域具有不可替代的作用,腳本是解釋性語言,它作為一門獨立的語言其功能和效率並不出色,但腳本更重要的是作為一種”粘合劑“把各種功能組合在一起,已完成更復雜的工作。如bash腳本裡充斥著大量的常用Linux命令和實用程序,如sed,awk,wc等等。
本人接觸Linux已有10多年,可惜至今尚未真正用bash做過什麼像樣的工作,痛定思痛,還是從0開始學起,在此記錄學習的點滴與困惑。
Bash腳本15分鐘進階教程 http://www.linuxidc.com/Linux/2014-04/100750.htm
10個 Linux/Unix下 Bash 和 KSH shell 的作業控制實例 http://www.linuxidc.com/Linux/2014-03/98159.htm
Ubuntu下shell腳本運行異常:Bash和dash的區別 http://www.linuxidc.com/Linux/2013-10/91100.htm
Bash腳本之for語句if語句以及各種測試語句 http://www.linuxidc.com/Linux/2013-07/87922.htm
什麼是Bash Shell的內建(build in)命令 http://www.linuxidc.com/Linux/2013-06/86039.htm
1 C語言的編碼習慣在Bash裡不適用
和大多數國內的IT人一樣,本人也是出身於從C系語言入門IT界,C,C++,C#,JAVA這些都是C系語言。帶著這樣的背景學習Bash編程時,往往很不習慣,一些在C看來良好的編碼習慣在Bash世界裡完全行不通。
1.1 等號兩邊不能有空格
在C語言裡,編寫代碼時一般都提倡在=兩側增加空格,如 a = 2; 這種良好的習慣到了Bash就變成了錯誤,Bash要求等號兩側不允許出現空格,否則就是語法錯誤!只能寫成a=2。
這裡稍微分析一下:因為bash是通過空格來隔離命令以及參數的,如果寫成a = 2,那麼bash會把a當成一個命令來執行,從而導致找不到一個叫做a的命令而宣告失敗。
1.2 語句末尾不用分號
在C語言裡,分號;是分割語句的語法要求,而在Bash裡含義完全不同。Bash語法的語句分割符號就是換行符號,一行代表一個語句,如果要在一行出現兩個以上語句,語句之間通過分號;進行區別。如
a=2;b=3與以下等同
a=2
b=3
1.3 默認所有的變量都是字符串類型
分析如下bash會輸出什麼。
a=2
b=3
c1=$a+$b
c2=a+b
c3=$(($a+$b))
echo $c1
echo $c2
echo $c3
答案是:
2+3
a+b
5
在Bash裡,任何值默認都是字符串,不管加沒加引號。兩個字符串放到一起就是連接。在這個例子裡,a這個變量初始值為字符串"2",b初始值為字符串"3",c1就是把”2“,”+","3"這三個字符串連接起來的字符串”2+3“;c2被直接初始化為字符串"a+b"。能夠按照數字進行計算的方式就是把算數表達式放到$((算數表達式))裡,本例中就是相當於$((2+3))。另外一種進行算數運算的方式是通過declare -i 聲明變量的類型為數值而不是字符串,以後再說。
1.4 變量名和變量的值不能混用
在C語言裡變量名就代表這個變量,當引用變量值的時候,直接用變量名即可。而在Bash裡,引用變量的值必須在變量名前加$前綴。看例子:
a=hello
echo a
echo $a
分別輸出
a
hello
因為Bash裡把不是命令和關鍵字的東西都當成是字符串,所以當echo a時,會把a當成事"a"字符串輸出。讓Bash識別出不是字符串而是變量值的方法就是加$,此時Bash會查找變量的值來替換$a。
2 true和false
2.1 true,false是命令不是常量
通常程序員接觸到的true,false是語言裡提供的常量,代表邏輯的真與假。而在bash裡這種想法不再好用,因為這是bash內建的兩個命令,其作用非常簡單就是用來修改exit狀態碼,我們測試得到true命令設置狀態碼為0,而false設置狀態碼為1,這與我們C出身的程序員的想法正好相反。
2.2 邏輯判斷的依據是退出狀態碼
看到if, while等,C出身的程序員眼裡想到的是真與假的判斷問題。在BASH裡也一樣,只是bash裡沒有邏輯變量一說,bash中的邏輯判斷的依據是上一次命令的退出狀態碼,如果上一個命令成功執行,那麼就判定為真。而POSIX規定了退出碼的標准:0表示命令成功執行;其他表示不成功。所以bash的if語句如下:
if 命令
then
為真的時候執行的語句
else
為假的時候執行的語句
當命令執行成功,設置狀態碼 $?=0, 此時算是為真,這是不是與你的想法正好相反呢?
3 命令與關鍵字
while, for, if, then, do, done這些是關鍵字,而test 或[ ,break, continue, return都是命令。處於可移植性考慮,不建議在函數體外使用return。
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-05/101573p2.htm