最近在搞Unix Shell的東西,在這個過程中看了不少書籍資料,也受了不少折騰,因此這裡把一些需要注意的細節記錄下來以作備忘和提醒。這裡的Shell是指Bourne Shell,其它類型的Shell我沒有用過因此不知道是否存在相同問題。另外Unix Shell的基礎資料這裡也不多介紹,其實網上的相關資料是比較散,加之Shell本身牽扯的東西也比較多,其中包括Unix的系統知識,不同版本Shell的語法和功能,正則表達式,管道什麼,要一次說清楚也不容易。這裡推薦一本書《UNIX shell范例精解》,在學習Shell的過程中它確實幫了不少忙。好,開始備忘。
1、關於環境變量
環境變量的作用域是由上到下的,並且在子進程裡改變了環境變量是不會傳遞回父進程。因此在全局使用的環境變量應該在父進程裡定義,子進程或者其它進程定義的環境變量不會能共享訪問。環境變量的這個特性對Shell程序的結構有很大的影響。因為如果要使用環境變量作為全局變量使用,那麼Shell腳本程序之間就必須保持一種至上向下的調用關系。
Shell裡面沒有全局變量的概念,只有環境變量和局部變量。全局變量的解決方案有這麼幾種:
a.使Shell腳本之間保持一個至上向下的調用關系,然後在父進程中定義環境變量;
b.使用只讀局部變量,然後保證所有腳本在同一進程下執行;
c.保存變量在一個config文件內,腳本執行加載;
或者這裡說到的全局變量有點常量的味道,畢竟全局變量是可以在過程之間共享信息的,但是上面提及的方法都不可以。如果要過程之間通信估計只有通過參數和返回值了。真正意義上的全局變量怎麼實現暫不做探討(因為我還沒有這個需求,嘻嘻)
其實把環境變量加載到Unix的主進程中也可以把它直接當全局變量使用,這個方法是第一個方案的特殊使用。
2、使用“.”調用腳本最好放在接收參數之後,不然可能會引起“$#”這些特殊變量的值的改變
3、if語句中使用“[]”替換test時,要注意“[]”使用是的空格,例如:if [ "$a" != "" ] then #空格不能省略
4、cp -R 時,要注意目標路徑中不需要提供復制後的目錄名,例如:cp -R /a /b/ 這樣將會把a目錄復制到b目錄中,復制後的目錄仍叫a(此處與xcopy有差別)
另外,cp並不會自動建立目標目錄。
5、使用while讀取文件時要注意
當使用
while read line
do
#####
done < file
讀取文件時,發現文件最後一行不會在while內讀取。這個問題不知道是不是上面代碼的寫法問題。