在Unix系統(tǒng)中使用變量的技巧
在任何一種開發(fā)語言中,變量都是不能缺少的一項內(nèi)容。在Unix操作系統(tǒng)中,也有變量一說。系統(tǒng)工程師在編寫腳本程序或者書寫命令時,都可以使用變量。筆者現(xiàn)在就跟大家談?wù)勗赨nix操作系統(tǒng)中如何使用變量,在什么情況下使用變量等問題。
一、變量的定義注意事項。
在Unix操作系統(tǒng)中定義變量比其他語言要簡單的多。因為其他語言使用變量的話要預(yù)先聲明,而在Unix操作系統(tǒng)中則不用。而且在Unix操作系統(tǒng)中定義變量時也不用注明其采用的是什么數(shù)據(jù)類型。系統(tǒng)會自動根據(jù)輸入的內(nèi)容來進行判斷。所以使用起來非常的方便。如現(xiàn)在用戶需要定義一個整數(shù)型的變量,只需要采用如下的格式即可:int1=1981。注意,此時雖然給變量賦值的是一個整數(shù),但是其是以字符串的形式存放。也就是說,當(dāng)目前為止,所有的Unix系統(tǒng)變量都是字符型的變量。或許這種情況在以后版本的操作系統(tǒng)中會改變。但是到目前為止,所有的shell變量都是字符型變量。這是系統(tǒng)工程師在使用變量的時候,必須要牢記的一個原則。
不過在定義變量的時候,筆者建議各位讀者要遵守如下的規(guī)范。
一是要注意變量的大小寫。雖然Unix系統(tǒng)中對于變量的大小寫沒有特殊的要求,無論大寫還是小寫都是可行的。但是在業(yè)內(nèi)確有一套不成文的規(guī)則。即操作系統(tǒng)和軟件開發(fā)工具包使用的變量名都是采用大寫的英文字母表示。而在用戶的腳本程序中使用的變量最好都用小寫字符表示。這主要是從變量的閱讀性上考慮的。將用戶自定義的變量同系統(tǒng)變量區(qū)分開來。如操作系統(tǒng)中的PATH等環(huán)節(jié)變量名字都是小寫的。這雖然不是一個強制性的規(guī)范,但是筆者希望各位讀者還是能夠遵守這個規(guī)范。
二是在變量進行初始化的時候,還有一個格式的要求。如在C shell中,既有一個比較嚴(yán)格的要求。如上面這個定義中,=左右兩邊都沒有采用空格。如果用戶想在左邊采用一個空格的話,那么在等號右邊也必須使用一個空格。即左右兩邊都必須對稱。否則的話,系統(tǒng)將無法識別這個變量。有些工程師可能有其他語言編程的經(jīng)驗,他們在這方面沒有這么苛刻的要求。但是如果在Unix操作系統(tǒng)中采用變量的話,這個規(guī)則必須要遵守,即變量賦值時等號兩側(cè)要么一個空格都沒有,要么都必須加上空格。
三是要注意在Unix操作系統(tǒng)中沒有常量的概念,而只有只讀變量的概念。其實兩個道理是相通的,只是名字叫法不同而已。如果系統(tǒng)工程師需要定義一個只讀的變量,那么只需要在變量前面加入一個關(guān)鍵字readonly即可。加入這個關(guān)鍵字之后,用戶就可以防止這個變量被修改。注意此時連創(chuàng)建這個變量的用戶都無法修改變量。其實,此時這個變量已經(jīng)變?yōu)榱顺A俊3怯脩粝壤胾nset關(guān)鍵字顯將這個只讀變量刪除,然后再重新建立。否則的話,只讀變量建立后,不能夠再進行修改,包括變量的主人在內(nèi)。
第四在Unix操作系統(tǒng)中,變量的引用對于其他語言也有所不同。無論是系統(tǒng)變量,還是用戶變量,在引用變量時都需要在變量名前面加入一個特殊的元字符即$。只有加上這個元字符后,系統(tǒng)才會認(rèn)為這是一個變量。如需要將上面建立的這個變量的值賦值給另外一個變量,必須使用如下的格式:int2=$int1。當(dāng)利用echo命令來顯示用戶變量與環(huán)境變量時,也必須采用這個格式,如echo $PATH等等。
#p#二、在哪些情況下該使用變量?
并不是在任何情況下使用變量都能夠起到應(yīng)有的效果。筆者認(rèn)為,在Unix操作系統(tǒng)中使用變量,無非有兩個用途。一是方便用戶的操作,二是提高腳本程序的重用性。具體來說,筆者認(rèn)為在如下情況下使用變量可以起到不錯的效果。
1、 利用變量來連接字符串。
在某些情況下,系統(tǒng)工程師經(jīng)常需要將某個變量與另外的一個變量或者字符串連接起來。如更改文件的擴展名就是一個最好的例子。如現(xiàn)在某個目錄下有很多腳本程序,可惜都是以txt為擴展名的。現(xiàn)在用戶想將這些文件都轉(zhuǎn)換為以sh為擴展名。如果想通過命令來實現(xiàn)更改的話,就需要使用變量。具體的實現(xiàn)原理時,先是用系統(tǒng)命令將原先的文件名分為兩部分,或者說,將原先的文件名去掉擴展名后賦值給變量filename。然后再將這個變量$filename與擴展名sh(可以將字符串sh也賦值給另外的一個變量如sh1)連接起來。則最后可以使用命令fullname=$filename$sh1的形式更改擴展名。如果想一次性完成的話,那么再搭配一個循環(huán)語句即可。
如果變量用來連接變量或者字符串時,筆者有些內(nèi)容要提醒各位讀者。當(dāng)將變量與字符串連接時,有時候需要使用單引號。如上面這個更改擴展名的案例中,如果擴展名不采用變量的形式來表示,而直接以sh來表示的話,那么最好能夠使用單引號來表示,如命令可以改寫為fullname=$filename’sh’。因為在變量$filename中,已經(jīng)有了表示擴展名的.號,所以在擴展名中就不用.號了。但是如果在$filename這個變量中沒有點號的話,那么就需要在字符串中加入.號。此時命令要改寫為fullname=$filename’.sh’。加入引號主要是出于可讀性考慮的。不過在有些特殊的情況下,必須要采用引號。如想在原先的文件名字后面(利用變量$filename表示)都加入一個007的后綴,則必須采用單引號。這個是強制的規(guī)則。在平時使用變量的過程中,除了可以使用單引號來增加可讀性之外,還可以使用花括號來增加可讀性。如上面的命令如果使用花括號的話,可以改寫為fullname=${filename}sh。注意不能夠?qū)?符號防止在括號里面。當(dāng)對是否需要采用單引號沒有強硬要求的情況下,工程師可以根據(jù)自己的喜好來選擇是采用單引號呢還是使用花括號。兩者沒有區(qū)別。
另外利用變量來連接字符串,除了更改擴展名外還有一個重要的應(yīng)用就是給系統(tǒng)變量PATH賦值。如在Unix系統(tǒng)中安裝了JDK應(yīng)用程序,那么就必須為JDK應(yīng)用程序在PATH變量中制定路徑。否則的話,JDK應(yīng)用程序無法執(zhí)行。此時可以使用命令PATH=$PATH:/jave(假設(shè)/java是JDK應(yīng)用程序的安裝路徑)。注意此時在變量與字符串之間必須加入一個:號。如果各位讀者不要誤解,這并不是變量與字符串連接時用到的連接符。從上面的案例中可以看到,當(dāng)一個變量與一個字符串連接時,并不需要連接符。而這個:符號是環(huán)境變量PATH自身的分隔符,跟這個變量的連接無關(guān)。不過為了提高這個命令的可讀性,筆者建議將這個命令改寫為PATH=${PATH}:/jave。
2、 簡化路徑的設(shè)置。
當(dāng)工程師查看其他人寫的腳本程序時,往往會發(fā)現(xiàn)在腳本程序的開頭,往往會定義幾個變量。其中有一個變量的用途就是用來制定腳本程序的啟動位置。如系統(tǒng)工程師可以訂一個變量,direchome=’/home/oracle/oracledabase’。如在這個命令下有很多的腳本程序。除非將這個目錄加入到PATH環(huán)境變量中,否則的話如果需要執(zhí)行這個腳本程序就需要輸入完整的路徑名或者進入到這個目錄中。顯然這比較麻煩。當(dāng)這個路徑比較長時,進入到這個目錄可比較費力。此時工程師就可以按照上面這種方式,將路徑名賦值給一個變量。然后在需要用到這個變量下的腳本程序時,可以使用$direchome/腳本程序名的方式來調(diào)用。或者先使用cd $direchome命令進入到這個命令,然后再啟動某個腳本程序。
這不僅方便了腳本程序的調(diào)用,而且也提高了靈活性。如以后腳本程序的位置發(fā)生了改變,那么之需要更改這個變量的值即可,其他語句不用進行更改。另外在一些腳本程序的命令中也可以使用變量來提高腳本程序的重用性。如可以使用tr字符替換命令來設(shè)計一個簡單的文件加密程序。在這個tr命令中,需要使用兩個參數(shù)。為此系統(tǒng)工程師可以將這個兩個參數(shù)使用兩個變量來表示。以后如果字符對應(yīng)的規(guī)則改變了,那么只需要更改這兩個變量的值即可。而不用更改腳本程序中的代碼。
最后需要提醒的一句是,如果將變量放置在單引號內(nèi),那么這個變量會被當(dāng)作普通字符來對帶。但是如果將其放置在雙引號內(nèi),則仍然會被當(dāng)作變量來處理。這是單引號與雙引號在Unix操作系統(tǒng)中差異所造成的。
【編輯推薦】