歡迎您光臨本站 註冊首頁

Unix利用轉義和引用來管理元字元

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

在Unix操作系統中有一類特殊的字元,叫做元字元.他們在系統中表示特殊的含義.如*號與?號,操作系統認為這些元字元是通配符.如果在路經、文件名或者命令參數中有這些元字元的話,就會引起操作系統的誤解.為此在系統中要採用一些方法,能夠讓操作系統將這些元字元當作普通字元來對待.在Unix系統中,就是採用轉義和引用這兩種方式來處理.系統工程師需要明白的是,這兩種解決方案的差異.並在特定的情況下,採用合適的解決方式.

  一、轉義功能的應用.

  其實轉義機制不僅僅在Unix操作系統上有,在其他的編程語言中也有類似的處理機制.如果各位讀者有程序開發經驗的話,那麼可能更加容易了解這個轉義功能.簡單的說,轉義功能就是指在一些具有特殊含義的元字元前面加上一個轉義字元,目的是告訴操作系統這是一個普通的字元,取消元字元的特殊意義.如*本來代表通配符,如ls *則表示所有的文件與目錄.而*就是將*號當作一個普通的字元來對待,系統不會再認為其是一個通配符.

  這個轉義功能的普通應用是比較簡單的,只需要在元字元前面加上即可.不過筆者這裡還需要強調轉義字元的幾個特殊的應用.這些應用雖然比較特殊,普通用戶平時不怎麼用的到.但是對於系統工程師來說,這些功能可能就特別的有用.

  一是需要在文件名中插入空格.如在微軟操作系統中有一個My Documents文件夾,其中間就有一個空格.這個空格在Unix系統中也屬於一個特殊的原字元.如果在建立文件或者目錄時,直接加入空格,則Unix操作系統會提示錯誤信息.此時往往需要轉移字元的幫助.如使用命令mkdir My Documents,就可以建立中間帶有空格的目錄名.如要建立帶有空格的文件名,也是如此.不過需要注意是,如果在文件或者目錄中包含了元字元的話,那麼在使用刪除命令或者目錄定位命令的時候,也需要採用轉移字元來定義這些特殊的元字元,否則的話可能會出現一些莫名其妙的問題.

  二是利用轉義字元對命令進行換行.在Unix操作系統中有些命令特別複雜,特別是那些部屬在Unix操作系統上的命令.如expdp是Oracle資料庫中的一個資料庫對象導出命令.雖然這個命令的功能很強大,但是可惜的是只有通過複雜的參數才能夠完成一些特定的功能.有時候一個命令需要好幾行才能夠寫完.雖然Unix操作系統提供了命令自動換行的方法.但是這個自動換行的功能比較薄弱,如不會在系統工程想要換行地方進行換行.為此採用這個自動換行的話,會造成代碼閱讀的困難.所以不少系統工程師還是希望能夠自己手工進行分行,在某些關鍵參數後面進行分行,以增加命令的可閱讀性.但是,如果直接使用回車鍵分行的話,系統是不認可的.這個回車鍵系統認為是一個執行命令的鍵.即當系統工程師點擊回車鍵的時候,系統會認為用戶已經將命令輸入完畢.鍵入回車鍵后系統就會自動運行這個命令.所以直接鍵入回車鍵往往不能夠完成命令分行的需求.此時就需要轉義字元的幫助.如現有一個命令比較長,工程師希望能夠將其分為兩行,主要是將參數-name後面的內容另起一行.此時就可以在這個參數前面加入一個轉義字元,然後再按回車鍵即可.由於有了這個轉義字元,系統就會取消回車鍵的換行作用.如此操作之後,系統會出現一個次級提示符,這個次級提示符表示命令還沒有結束,下一行繼續.這個功能對於系統工程師來說,可能是非常實用的.此時系統工程師可以輕鬆的將一長串的命令根據自己的需要來進行分行,從而提高命令的可讀性.

  另外需要注意的是,這個轉義字元本身就是一個比較特殊的元字元.如果用戶想在命令或者文件名中使用這個符號的話,也需要採用轉移字元.如用戶想利用echo或者printf命令顯示網址.在網址中就有很多符號,此時就需要採用轉義字元來讓系統將符號當作普通字元來對待.

  二、利用引用來解決元字元的問題.

  除了可以利用上面談到的引用功能來處理這些元字元以外,還可以採用引用這個功能來解決.簡單的說,就是將一個命令參數放置在一對引號之內,則這個引號之內內容如果有元字元的話,則這些元字元將不起作用.那麼既然轉義功能已經可以解決元字元的問題,系統還提出了一個引用的解決方案,是否多次一舉呢?其實不然.當一個命令行中含有多個元字元的時候,需要在每個元字元前面加一個轉移字元.為此此時如果採用轉義字元來解決這個元字元的問題時,會非常的繁瑣.此時如果採用引用機制來解決元字元的問題時,可能會更加的理想.如現在系統工程師希望能夠在屏幕上打出如下信息(這是一個共享文件的路徑):192.128.11.3shareITsoftwarepdf.如果採用轉移字元的話,該如何寫呢?由於這個輸出結果中有四個元字元(轉義字元),為此管理員不得不用四個轉移字元來處理.即要寫成echo 192.128.11.3\share\IT\software\pdf.這顯然非常的麻煩.遇到這種情況時,如果採用引用的話,顯然會更加的合適.如採用引用機制,只需要將這個命令寫為即可:

  echo 『192.128.11.3shareITsoftwarepdf』

  將一大串命令採用單引號因起來.則系統會將命令行中的一些元字元都當作普通字元來對待.即不需要為每一個元字元採用轉移字元.顯然這個引用解決方案要比採用轉義字元來解決要方便的多.

在採用引用機制來處理元字元時,需要注意跟雙引號的區別.如現在有如下三個命令echo $JAVA_HOME、echo 『$JAVA_HOME』、 「echo $JAVA_HOME」.其中$JAVA_HOME表示應用程序Java的環境變數.此時如果系統工程師依次運行上面這三個命令,會有什麼結果呢?第一個命令會正常顯示Java的環境變數;第二個命令直接顯示$JAVA_HOME,即已經將元字元$當作普通字元來對待.第三個命令的話仍然顯示Java的環境變數.可見雙引號與單引號在引用機制上,還是有所不同的.那麼他們到底有什麼差異呢?總的來說,系統工程師需要注意如下內容.單引號會保護裡面所有的元字元,即遇到元字元時會告訴系統當作普通字元來對待.但是如果採用了雙引號,則系統會將單引號之間的內容解釋為命令行.如會將$當作環境變數的前綴等等.其實單引號與雙引號還有一種相互保護的作用.即雙引號保護其中的單引號,而單引號保護其中的雙引號.無論是雙引號還是單引號本身就都是元字元,可以通過引用機制來進行保護.不過在遇到單引號與雙引號(都當作普通字元)都存在的情況下,筆者建議還是採用轉移字元來保護單引號或者雙引號為好.這可以避免誤解,也容易提高代碼的可讀性.同理,如果要將轉移字元 當作普通字元來實用的話,那麼最好也是利用單引號來保護這個轉移字元,而不是利用轉移字元來保護轉移字元.這些雖然不影響實際的應用,但是卻是提高代碼可讀性的有效手段.

  從以上的分析中可以看出,雖然轉移字元與引用機制等等都可以將元字元當作普通字元來對待.但是,兩者在實現的方法上還是有一定的差異.為此最好能夠根據應用場合的不同,在選擇合適的解決方案.一般來說,兩者的差異只是實現方法上的差異,在具體的功能上沒有區別.不過為了代碼的易讀性上考慮,選擇具體的解決方案是還需要慎重.不過總的來說,系統工程師必須同時掌握這兩種方法.然後根據不同的情況現在合適的解決方法.如果光掌握一種解決措施,可能不能夠解決所有跟元字元相關的問題.


[火星人 ] Unix利用轉義和引用來管理元字元已經有349次圍觀

http://coctec.com/docs/linux/show-post-52046.html