標籤:shell
波浪號展開與萬用字元
shell中兩種與檔案名稱相關的展開.第一種是波浪號展開,第二種是萬用字元展開式.
波浪號展開
如果命令列字串的第一個字元為波浪號(~),或者變數指定(例如PATH或CDPATH變數)的值裡任何未被引號括起來的冒號之後的第一個字元為波浪號(~)時,shell變回執行波浪號展開.
波浪號展開的目的,將使用者根目錄的符號型表示方式,改為實際的目錄路徑.可以採用直接或間接的方式指定執行此程式的使用者,如未明白指定,則為當前的使用者:
命令:vi ~/.profile 與vi $HOME/.profile相同
命令:vi ~root/.profile 編輯使用者root的.profile檔案
案例分析:第一個命令,shell將~換成$HOME,也就是目前使用者的根目錄.第二個命令,則是shell在系統的密碼庫裡,需找使用者root,再將~root置換為root的根目錄.
使用波浪號的好處:
1.這是一種簡介的概念表示方式
2.這可以避免在程式裡把路徑名稱直接編碼,例如:
有一段bash指令碼:
printf “enter username : ”
read user
vi /home/$user/.profile 編輯該使用者的.profile檔案
這段程式假設所有使用者的根目錄都在/home之下.如果這又任何變動(例如,使用者子目錄根據部門存放在部門目錄的子目錄下),那麼這個指令碼就得重寫.但如果使用波浪號展開,就能避免重寫的情況:
printf “enter username : ”
read user
vi /home/$user/.profile 編輯該使用者的.profile檔案
這樣一來,無論使用者的根目錄在哪裡,程式都能正常運行了.
使用萬用字元
尋找檔案名稱裡的特殊字元,也是shell提供的服務之一.
基本的萬用字元 |
萬用字元 |
匹配 |
* |
任何的字串字元 |
[set] |
任何在set裡的字元 |
[!set] |
任何不在set裡的字元 |
? |
任何的單一字元 |
?萬用字元匹配於任何的單一字元,所以如果你的目錄裡含有demo.a,demo.b,demo.txt這三個檔案,與運算式demo.?匹配為demo.a,demo.b,但是demo.txt則不匹配.
星號(*)是一個功能強大的且廣為使用的萬用字元;它匹配於任何字元組成的字串.使用運算式demo.*會匹配前面說的三個檔案;網頁設計人員也可以用*.html運算式匹配他們的輸入檔案.
set結構是一組組字元列表(例如abc),一段內含的範圍(如a-z),或者是兩者的結合.如果希望破折號也是列表的一部分,只要把它放在第一個或最後一個就可以了.
使用set結構的萬用字元 |
運算式 |
匹配的單一字元 |
[abc] |
a,b或c |
[.,;] |
句號,逗號,或分號 |
[-_] |
破折號或底線 |
[a-c] |
a,b或c |
[a-z] |
任意一個小寫字母 |
[!0-9] |
任意一個非數字字元 |
[0-9!] |
任意一個數字會驚嘆號 |
[a-zA-Z] |
任意一個大寫或小寫字母 |
[a-zA-Z0_9_-] |
任何一個字母,任何一個數字,底線或破折號 |
在原來的萬用字元返利中,demo.[ab]與demo.[a-z]兩者都匹配demo.a和demo.b,但是demo.txt則不匹配.
在左方括弧之後的驚嘆號用來”否定”一個set.例如[!.;]符合句號和分號以外的任何一個字元;[!a-zA-Z]符合任何一個非字母的字元.
範圍標記法固然方便,但不應該對包含在範圍內的字元有太多的假設.比較安全的方式是:分別指定所有大寫字母,小寫字母,數字,或任意的子範圍(例如[f-q].[2-6]).不要想在標點符號字元上指定範圍,或是在混用字母大小寫上使用,像[a-Z]與[A-z]這樣的用法,都不能保證一定能確切的匹配出包括所有想要的字母,而沒有其他不想要的字元.更大的問題是在於:這樣的範圍在不同的類型之間的電腦之間無法提供完全的可移植性.
另一個問題是:很多國家預設的系統語言環境與純粹的ASCII的字元集是不同的.為瞭解決這個問題,POSIX標準提出了方括號運算式,用來表示字母,數字,標點符號以及其他類型的字元,並且具有可移植性.在Regex下的方括號運算式裡也出現相同的元素,它們可被用在相容POSIX的shell內的shell萬用字元模式中,不過應該盡量避免將其應用在需可移植的shell指令碼裡.
習慣上,當執行萬用字元展開時,linux shell會忽略檔案名稱開頭為一個點號的檔案.像這樣的”點號檔案”通常用做程式設定檔或開機檔案(一般都隱藏起來了,需要使用 ls -a來查看).像是shell的$HOME/.profile,ex/vi編輯器的$HOME/.exrc,以及bash與gdb使用的GNU readline程式庫的$HOME/.inputrc.
要看到這類檔案,需要在模式前面明確的提供一個點號.例如:
echo .* 顯示隱藏檔案
注意:隱藏檔案只是一個習慣用法.在使用者層面的軟體上他是這樣的,但核心程式(kernel)並不認為開頭帶有一個點號的檔案與其他檔案有不同.
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
shell學習三十五天----波浪號展開與萬用字元