Unix Shell注意問題備忘
最近在接觸一些Unix Shell的東西,在這個(gè)過程中看了不少書籍資料,也受了不少折騰,因此這里把一些需要注意的細(xì)節(jié)記錄下來以作備忘和提醒。這里的Shell是指Bourne Shell,其它類型的Shell我沒有用過因此不知道是否存在相同問題。
另外Unix Shell的基礎(chǔ)資料這里也不多介紹,其實(shí)網(wǎng)上的相關(guān)資料是比較散,加之Shell本身牽扯的東西也比較多,其中包括Unix的系統(tǒng)知識(shí),不同版本Shell的語法和功能,正則表達(dá)式,管道什么,要一次說清楚也不容易。這里推薦一本書《UNIX shell范例精解》,在學(xué)習(xí)Shell的過程中它確實(shí)幫了不少忙。好,開始備忘。
1、關(guān)于Unix Shell環(huán)境變量
環(huán)境變量的作用域是由上到下的,并且在子進(jìn)程里改變了環(huán)境變量是不會(huì)傳遞回父進(jìn)程。因此在全局使用的環(huán)境變量應(yīng)該在父進(jìn)程里定義,子進(jìn)程或者其它進(jìn)程定義的環(huán)境變量不會(huì)能共享訪問。環(huán)境變量的這個(gè)特性對(duì)Shell程序的結(jié)構(gòu)有很大的影響。因?yàn)槿绻褂铆h(huán)境變量作為全局變量使用,那么Shell腳本程序之間就必須保持一種至上向下的調(diào)用關(guān)系。
Unix Shelll里面沒有全局變量的概念,只有環(huán)境變量和局部變量。全局變量的解決方案有這么幾種:
a.使Shell腳本之間保持一個(gè)至上向下的調(diào)用關(guān)系,然后在父進(jìn)程中定義環(huán)境變量;
b.使用只讀局部變量,然后保證所有腳本在同一進(jìn)程下執(zhí)行;
c.保存變量在一個(gè)config文件內(nèi),腳本執(zhí)行加載;
或者這里說到的全局變量有點(diǎn)常量的味道,畢竟全局變量是可以在過程之間共享信息的,但是上面提及的方法都不可以。如果要過程之間通信估計(jì)只有通過參數(shù)和返回值了。真正意義上的全局變量怎么實(shí)現(xiàn)暫不做探討。
其實(shí)把環(huán)境變量加載到Unix的主進(jìn)程中也可以把它直接當(dāng)全局變量使用,這個(gè)方法是***個(gè)方案的特殊使用。
2、使用“.”調(diào)用腳本***放在接收參數(shù)之后,不然可能會(huì)引起“$#”這些特殊變量的值的改變
3、if語句中使用“[]”替換test時(shí),要注意“[]”使用是的空格,例如:if [ "$a" != "" ] then #空格不能省略
4、cp -R 時(shí),要注意目標(biāo)路徑中不需要提供復(fù)制后的目錄名,例如:cp -R /a /b/ 這樣將會(huì)把a(bǔ)目錄復(fù)制到b目錄中,復(fù)制后的目錄仍叫a(此處與xcopy有差別)
另外,cp并不會(huì)自動(dòng)建立目標(biāo)目錄。
5、使用while讀取文件時(shí)要注意 當(dāng)使用
- while read line
- do
- #####
- done < file
讀取文件時(shí),發(fā)現(xiàn)文件***一行不會(huì)在while內(nèi)讀取。這個(gè)問題不知道是不是上面代碼的寫法問題。這就是這次關(guān)于Unix Shell中的知識(shí)的講解。
【編輯推薦】
- 提高Unix系統(tǒng)安全性和穩(wěn)定性
- 講述5種Unix關(guān)機(jī)方法
- 提高Unix系統(tǒng)安全性和穩(wěn)定性
- 使用Unix密鑰啟用自動(dòng)登錄
- unixware進(jìn)程相關(guān)的命令