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