shell 中兩種與文件名相關(guān)的展開.第一種是波浪號展開,第二種是通配符展開式.
波浪號展開
如果命令行字符串的第一個字符為波浪號(~),或者變量指定(例如 PATH 或 CDPATH 變量)的值里任何未被引號括起來的冒號之后的第一個字符為波浪號(~)時,shell 變回執(zhí)行波浪號展開.
波浪號展開的目的,將用戶根目錄的符號型表示方式,改為實際的目錄路徑.可以采用直接或間接的方式指定執(zhí)行此程序的用戶,如未明白指定,則為當(dāng)前的用戶:
命令:vi ~/.profile
與vi $HOME/.profile
相同
命令:vi ~root/.profile
編輯用戶 root 的.profile 文件
案例分析:第一個命令,shell 將~換成$HOME,也就是當(dāng)前用戶的根目錄.第二個命令,則是 shell 在系統(tǒng)的密碼庫里,需找用戶 root,再將~root 置換為 root 的根目錄.
使用波浪號的好處:
printf “enter username : ”
read user
vi /home/$user/.profile 編輯該用戶的.profile 文件
這段程序假設(shè)所有用戶的根目錄都在/home 之下.如果這又任何變動(例如,用戶子目錄根據(jù)部門存放在部門目錄的子目錄下),那么這個腳本就得重寫.但如果使用波浪號展開,就能避免重寫的情況:
printf “enter username : ”
read user
vi /home/$user/.profile 編輯該用戶的.profile文件
這樣一來,無論用戶的根目錄在哪里,程序都能正常運行了.
使用通配符
尋找文件名里的特殊字符,也是shell提供的服務(wù)之一.
???????????????????基本的通配符 |
|
通配符 |
匹配 |
* |
任何的字符串字符 |
[set] |
任何在set里的字符 |
[!set] |
任何不在set里的字符 |
? |
任何的單一字符 |
?通配符匹配于任何的單一字符,所以如果你的目錄里含有demo.a,demo.b,demo.txt 這三個文件,與表達式 demo.?匹配為 demo.a,demo.b,但是 demo.txt 則不匹配.
星號()是一個功能強大的且廣為使用的通配符;它匹配于任何字符組成的字符串.使用表達式 demo.會匹配前面說的三個文件;網(wǎng)頁設(shè)計人員也可以用*.html 表達式匹配他們的輸入文件.
set 結(jié)構(gòu)是一組組字符列表(例如 abc),一段內(nèi)含的范圍(如 a-z),或者是兩者的結(jié)合.如果希望破折號也是列表的一部分,只要把它放在第一個或最后一個就可以了.
????????????????????使用set結(jié)構(gòu)的通配符 |
|
表達式 |
匹配的單一字符 |
[abc] |
a,b或c |
[.,;] |
句號,逗號,或分號 |
[-_] |
破折號或下劃線 |
[a-c] |
a,b或c |
[a-z] |
任意一個小寫字母 |
[!0-9] |
任意一個非數(shù)字字符 |
[0-9!] |
任意一個數(shù)字會感嘆號 |
[a-zA-Z] |
任意一個大寫或小寫字母 |
[a-zA-Z0_9_-] |
任何一個字母,任何一個數(shù)字,下劃線或破折號 |
在原來的通配符返利中,demo.[ab]與 demo.[a-z]兩者都匹配demo.a 和 demo.b,但是 demo.txt 則不匹配.
在左方括號之后的感嘆號用來”否定”一個 set.例如[!.;]符合句號和分號以外的任何一個字符;[!a-zA-Z]符合任何一個非字母的字符.
范圍表示法固然方便,但不應(yīng)該對包含在范圍內(nèi)的字符有太多的假設(shè).比較安全的方式是:分別指定所有大寫字母,小寫字母,數(shù)字,或任意的子范圍(例如[f-q].[2-6]).不要想在標點符號字符上指定范圍,或是在混用字母大小寫上使用,像[a-Z]與[A-z]這樣的用法,都不能保證一定能確切的匹配出包括所有想要的字母,而沒有其他不想要的字符.更大的問題是在于:這樣的范圍在不同的類型之間的計算機之間無法提供完全的可移植性.
另一個問題是:很多國家默認的系統(tǒng)語言環(huán)境與純粹的 ASCII 的字符集是不同的.為了解決這個問題,POSIX 標準提出了方括號表達式,用來表示字母,數(shù)字,標點符號以及其他類型的字符,并且具有可移植性.在正則表達式下的方括號表達式里也出現(xiàn)相同的元素,它們可被用在兼容 POSIX 的 shell 內(nèi)的 shell 通配符模式中,不過應(yīng)該盡量避免將其應(yīng)用在需可移植的 shell 腳本里.
習(xí)慣上,當(dāng)執(zhí)行通配符展開時,linux shell 會忽略文件名開頭為一個點號的文件.像這樣的”點號文件”通常用做程序配置文件或啟動文件(一般都隱藏起來了,需要使用 ls -a 來查看).像是 shell 的$HOME/.profile,ex/vi 編輯器的$HOME/.exrc,以及 bash 與 gdb 使用的 GNU readline 程序庫的$HOME/.inputrc.
要看到這類文件,需要在模式前面明確的提供一個點號.例如:
echo .* 顯示隱藏文件
注意:隱藏文件只是一個習(xí)慣用法.在用戶層面的軟件上他是這樣的,但核心程序(kernel)并不認為開頭帶有一個點號的文件與其他文件有不同.