


Unix利用轉(zhuǎn)義和引用來管理元字符
在Unix操作系統(tǒng)中有一類特殊的字符,叫做元字符。他們在系統(tǒng)中表示特殊的含義。如*號與?號,操作系統(tǒng)認(rèn)為這些元字符是通配符。如果在路經(jīng)、文件名或者命令參數(shù)中有這些元字符的話,就會(huì)引起操作系統(tǒng)的誤解。為此在系統(tǒng)中要采用一些方法,能夠讓操作系統(tǒng)將這些元字符當(dāng)作普通字符來對待。在Unix系統(tǒng)中,就是采用轉(zhuǎn)義和引用這兩種方式來處理。系統(tǒng)工程師需要明白的是,這兩種解決方案的差異。并在特定的情況下,采用合適的解決方式。
一、轉(zhuǎn)義功能的應(yīng)用。
其實(shí)轉(zhuǎn)義機(jī)制不僅僅在Unix操作系統(tǒng)上有,在其他的編程語言中也有類似的處理機(jī)制。如果各位讀者有程序開發(fā)經(jīng)驗(yàn)的話,那么可能更加容易了解這個(gè)轉(zhuǎn)義功能。簡單的說,轉(zhuǎn)義功能就是指在一些具有特殊含義的元字符前面加上一個(gè)轉(zhuǎn)義字符\,目的是告訴操作系統(tǒng)這是一個(gè)普通的字符,取消元字符的特殊意義。如*本來代表通配符,如ls *則表示所有的文件與目錄。而\*就是將*號當(dāng)作一個(gè)普通的字符來對待,系統(tǒng)不會(huì)再認(rèn)為其是一個(gè)通配符。
這個(gè)轉(zhuǎn)義功能的普通應(yīng)用是比較簡單的,只需要在元字符前面加上\即可。不過筆者這里還需要強(qiáng)調(diào)轉(zhuǎn)義字符的幾個(gè)特殊的應(yīng)用。這些應(yīng)用雖然比較特殊,普通用戶平時(shí)不怎么用的到。但是對于系統(tǒng)工程師來說,這些功能可能就特別的有用。
一是需要在文件名中插入空格。如在微軟操作系統(tǒng)中有一個(gè)My Documents文件夾,其中間就有一個(gè)空格。這個(gè)空格在Unix系統(tǒng)中也屬于一個(gè)特殊的原字符。如果在建立文件或者目錄時(shí),直接加入空格,則Unix操作系統(tǒng)會(huì)提示錯(cuò)誤信息。此時(shí)往往需要轉(zhuǎn)移字符的幫助。如使用命令mkdir My \ Documents,就可以建立中間帶有空格的目錄名。如要建立帶有空格的文件名,也是如此。不過需要注意是,如果在文件或者目錄中包含了元字符的話,那么在使用刪除命令或者目錄定位命令的時(shí)候,也需要采用轉(zhuǎn)移字符來定義這些特殊的元字符,否則的話可能會(huì)出現(xiàn)一些莫名其妙的問題。
二是利用轉(zhuǎn)義字符對命令進(jìn)行換行。在Unix操作系統(tǒng)中有些命令特別復(fù)雜,特別是那些部屬在Unix操作系統(tǒng)上的命令。如expdp是Oracle數(shù)據(jù)庫中的一個(gè)數(shù)據(jù)庫對象導(dǎo)出命令。雖然這個(gè)命令的功能很強(qiáng)大,但是可惜的是只有通過復(fù)雜的參數(shù)才能夠完成一些特定的功能。有時(shí)候一個(gè)命令需要好幾行才能夠?qū)懲辍km然Unix操作系統(tǒng)提供了命令自動(dòng)換行的方法。但是這個(gè)自動(dòng)換行的功能比較薄弱,如不會(huì)在系統(tǒng)工程想要換行地方進(jìn)行換行。為此采用這個(gè)自動(dòng)換行的話,會(huì)造成代碼閱讀的困難。所以不少系統(tǒng)工程師還是希望能夠自己手工進(jìn)行分行,在某些關(guān)鍵參數(shù)后面進(jìn)行分行,以增加命令的可閱讀性。但是,如果直接使用回車鍵分行的話,系統(tǒng)是不認(rèn)可的。因?yàn)檫@個(gè)回車鍵系統(tǒng)認(rèn)為是一個(gè)執(zhí)行命令的鍵。即當(dāng)系統(tǒng)工程師點(diǎn)擊回車鍵的時(shí)候,系統(tǒng)會(huì)認(rèn)為用戶已經(jīng)將命令輸入完畢。鍵入回車鍵后系統(tǒng)就會(huì)自動(dòng)運(yùn)行這個(gè)命令。所以直接鍵入回車鍵往往不能夠完成命令分行的需求。此時(shí)就需要轉(zhuǎn)義字符的幫助。如現(xiàn)有一個(gè)命令比較長,工程師希望能夠?qū)⑵浞譃閮尚校饕菍?shù)-name后面的內(nèi)容另起一行。此時(shí)就可以在這個(gè)參數(shù)前面加入一個(gè)轉(zhuǎn)義字符\,然后再按回車鍵即可。由于有了這個(gè)轉(zhuǎn)義字符,系統(tǒng)就會(huì)取消回車鍵的換行作用。如此操作之后,系統(tǒng)會(huì)出現(xiàn)一個(gè)次級提示符,這個(gè)次級提示符表示命令還沒有結(jié)束,下一行繼續(xù)。這個(gè)功能對于系統(tǒng)工程師來說,可能是非常實(shí)用的。因?yàn)榇藭r(shí)系統(tǒng)工程師可以輕松的將一長串的命令根據(jù)自己的需要來進(jìn)行分行,從而提高命令的可讀性。
另外需要注意的是,\這個(gè)轉(zhuǎn)義字符本身就是一個(gè)比較特殊的元字符。如果用戶想在命令或者文件名中使用這個(gè)\符號的話,也需要采用轉(zhuǎn)移字符。如用戶想利用echo或者printf命令顯示網(wǎng)址。在網(wǎng)址中就有很多\符號,此時(shí)就需要采用轉(zhuǎn)義字符來讓系統(tǒng)將\符號當(dāng)作普通字符來對待。
二、利用引用來解決元字符的問題。
除了可以利用上面談到的引用功能來處理這些元字符以外,還可以采用引用這個(gè)功能來解決。簡單的說,就是將一個(gè)命令參數(shù)放置在一對引號之內(nèi),則這個(gè)引號之內(nèi)內(nèi)容如果有元字符的話,則這些元字符將不起作用。那么既然轉(zhuǎn)義功能已經(jīng)可以解決元字符的問題,系統(tǒng)還提出了一個(gè)引用的解決方案,是否多次一舉呢?其實(shí)不然。當(dāng)一個(gè)命令行中含有多個(gè)元字符的時(shí)候,需要在每個(gè)元字符前面加一個(gè)轉(zhuǎn)移字符。為此此時(shí)如果采用轉(zhuǎn)義字符來解決這個(gè)元字符的問題時(shí),會(huì)非常的繁瑣。此時(shí)如果采用引用機(jī)制來解決元字符的問題時(shí),可能會(huì)更加的理想。如現(xiàn)在系統(tǒng)工程師希望能夠在屏幕上打出如下信息(這是一個(gè)共享文件的路徑):192.128.11.3\share\IT\software\pdf。如果采用轉(zhuǎn)移字符的話,該如何寫呢?由于這個(gè)輸出結(jié)果中有四個(gè)元字符(轉(zhuǎn)義字符\),為此管理員不得不用四個(gè)轉(zhuǎn)移字符來處理。即要寫成echo 192.128.11.3\\share\\IT\\software\\pdf。這顯然非常的麻煩。遇到這種情況時(shí),如果采用引用的話,顯然會(huì)更加的合適。如采用引用機(jī)制,只需要將這個(gè)命令寫為即可:
echo ‘192.128.11.3\share\IT\software\pdf’
將一大串命令采用單引號因起來。則系統(tǒng)會(huì)將命令行中的一些元字符都當(dāng)作普通字符來對待。即不需要為每一個(gè)元字符采用轉(zhuǎn)移字符。顯然這個(gè)引用解決方案要比采用轉(zhuǎn)義字符來解決要方便的多。
在采用引用機(jī)制來處理元字符時(shí),需要注意跟雙引號的區(qū)別。如現(xiàn)在有如下三個(gè)命令echo $JAVA_HOME、echo ‘$JAVA_HOME’、 “echo $JAVA_HOME”。其中$JAVA_HOME表示應(yīng)用程序Java的環(huán)境變量。此時(shí)如果系統(tǒng)工程師依次運(yùn)行上面這三個(gè)命令,會(huì)有什么結(jié)果呢?第一個(gè)命令會(huì)正常顯示Java的環(huán)境變量;第二個(gè)命令直接顯示$JAVA_HOME,即已經(jīng)將元字符$當(dāng)作普通字符來對待。第三個(gè)命令的話仍然顯示Java的環(huán)境變量。可見雙引號與單引號在引用機(jī)制上,還是有所不同的。那么他們到底有什么差異呢?總的來說,系統(tǒng)工程師需要注意如下內(nèi)容。單引號會(huì)保護(hù)里面所有的元字符,即遇到元字符時(shí)會(huì)告訴系統(tǒng)當(dāng)作普通字符來對待。但是如果采用了雙引號,則系統(tǒng)會(huì)將單引號之間的內(nèi)容解釋為命令行。如會(huì)將$當(dāng)作環(huán)境變量的前綴等等。其實(shí)單引號與雙引號還有一種相互保護(hù)的作用。即雙引號保護(hù)其中的單引號,而單引號保護(hù)其中的雙引號。因?yàn)闊o論是雙引號還是單引號本身就都是元字符,可以通過引用機(jī)制來進(jìn)行保護(hù)。不過在遇到單引號與雙引號(都當(dāng)作普通字符)都存在的情況下,筆者建議還是采用轉(zhuǎn)移字符來保護(hù)單引號或者雙引號為好。這可以避免誤解,也容易提高代碼的可讀性。同理,如果要將轉(zhuǎn)移字符\ 當(dāng)作普通字符來實(shí)用的話,那么最好也是利用單引號來保護(hù)這個(gè)轉(zhuǎn)移字符,而不是利用轉(zhuǎn)移字符來保護(hù)轉(zhuǎn)移字符。這些雖然不影響實(shí)際的應(yīng)用,但是卻是提高代碼可讀性的有效手段。
從以上的分析中可以看出,雖然轉(zhuǎn)移字符與引用機(jī)制等等都可以將元字符當(dāng)作普通字符來對待。但是,兩者在實(shí)現(xiàn)的方法上還是有一定的差異。為此最好能夠根據(jù)應(yīng)用場合的不同,在選擇合適的解決方案。一般來說,兩者的差異只是實(shí)現(xiàn)方法上的差異,在具體的功能上沒有區(qū)別。不過為了代碼的易讀性上考慮,選擇具體的解決方案是還需要慎重。不過總的來說,系統(tǒng)工程師必須同時(shí)掌握這兩種方法。然后根據(jù)不同的情況現(xiàn)在合適的解決方法。如果光掌握一種解決措施,可能不能夠解決所有跟元字符相關(guān)的問題。
關(guān)鍵字:數(shù)據(jù)、元字符
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解