鍍金池/ 教程/ Linux/ shell 學(xué)習(xí)三十五天----波浪號展開與通配符
shell 學(xué)習(xí)四十一天----列出文件 ls 和 od 命令
shell 學(xué)習(xí)小結(jié)
shell 學(xué)習(xí)第二十八天----case 語句
shell 學(xué)習(xí)四十四天----尋找文件
shell 學(xué)習(xí)三十五天----波浪號展開與通配符
shell 學(xué)習(xí)三十八天----執(zhí)行順序和 eval
shell 學(xué)習(xí)四十八天----文件校驗(yàn)和匹配
shell 學(xué)習(xí)四十天----awk 的驚人表現(xiàn)
shell 學(xué)習(xí)第十一天----sed 正則的精確控制
shell 學(xué)習(xí)第十七天----awk 命令
shell 學(xué)習(xí)三十九天----內(nèi)建命令
shell 學(xué)習(xí)四十五天----xargs
shell 學(xué)習(xí)三十七天----引用
shell 學(xué)習(xí)第十六天----join 練習(xí)
shell 學(xué)習(xí)第二十四天----提取開頭或結(jié)尾數(shù)行
shell 學(xué)習(xí)第九天----分組
shell 學(xué)習(xí)第五天----基本的 I/O 重定向
shell 學(xué)習(xí)第十五天----使用 cut 選定字段
shell 學(xué)習(xí)四十六天----文件系統(tǒng)的空間信息 df 和 du 命令
shell 學(xué)習(xí)第八天----擴(kuò)展正則表達(dá)式 (ERE)
shell 學(xué)習(xí)第十九天----文本塊排序
shell 學(xué)習(xí)第二十一天----重新格式化段落
shell 學(xué)習(xí)三十六天----命令替換
shell 學(xué)習(xí)第二十天----sort 的其他內(nèi)容以及 uniq 命令
shell 學(xué)習(xí)四十二天----使用 touch 更新文件時間
shell 學(xué)習(xí)五十一天----top 命令查看進(jìn)程列表
shell 學(xué)習(xí)第一天
shell 學(xué)習(xí)五十四天----進(jìn)程系統(tǒng)調(diào)用的追蹤 strace
shell 學(xué)習(xí)五十天----查看進(jìn)程 ps 命令
shell 學(xué)習(xí)第二十七天----退出狀態(tài)和 if 語句
shell 學(xué)習(xí)第二十三天----打印
shell 學(xué)習(xí)三十三天----關(guān)于重定向
shell 學(xué)習(xí)四十九天----進(jìn)程建立
shell 學(xué)習(xí)第三十天----break,continue,shift,getopts
shell 學(xué)習(xí)五十五天----進(jìn)程記賬
shell 學(xué)習(xí)總結(jié)一
shell 學(xué)習(xí)第二十六天----變量與算數(shù)
shell 學(xué)習(xí)第二十二天----計(jì)算行數(shù), 字?jǐn)?shù)以及字符數(shù)
shell 學(xué)習(xí)五十八天----/proc 文件系統(tǒng)
shell 學(xué)習(xí)第二十五天----神器的管道符
shell 學(xué)習(xí)第三十二天----read 讀取一行
sheel 學(xué)習(xí)第三天
shell 學(xué)習(xí)----小結(jié)
shell 學(xué)習(xí)第十八天----文本排序
shell 學(xué)習(xí)第三十一天----函數(shù)問題
shell 學(xué)習(xí)第十天----sed 查找與替換
shell 學(xué)習(xí)四十三天----臨時性文件的建立與使用
shell 學(xué)習(xí)四十七天----文件比較 cmp,diff,patch
shell 學(xué)習(xí)三十四天----printf 詳解
shell 學(xué)習(xí)五十七天 ----linux 任務(wù)管理,針對上一講的總結(jié)和擴(kuò)展
shell 學(xué)習(xí)第六天----小結(jié)
shell 學(xué)習(xí)第十三天----sed 案例分析
shell 學(xué)習(xí)第七天----基礎(chǔ)正則表達(dá)式 (BRE)
shell 學(xué)習(xí)第十二天----行與字符串
shell 學(xué)習(xí)小結(jié)四
shell 學(xué)習(xí)第二十九天----循環(huán)
shell 學(xué)習(xí)五十二天----刪除進(jìn)程 kill 命令
shell 學(xué)習(xí)五十六天----延遲進(jìn)程調(diào)度
shell 學(xué)習(xí)第四天----華麗的 printf 輸出
shell 學(xué)習(xí)第十五天----join 連接字段
shell 學(xué)習(xí)完結(jié)篇----希望你能看到
shell 學(xué)習(xí)第二天
shell 學(xué)習(xí)五十三天----捕獲信號 trap

shell 學(xué)習(xí)三十五天----波浪號展開與通配符

波浪號展開與通配符

shell 中兩種與文件名相關(guān)的展開。第一種是波浪號展開,第二種是通配符展開式。

波浪號展開

如果命令行字符串的第一個字符為波浪號 (~),或者變量指定 (例如 PATHCDPATH 變量) 的值里任何未被引號括起來的冒號之后的第一個字符為波浪號 (~) 時,shell 變回執(zhí)行波浪號展開。

波浪號展開的目的,將用戶根目錄的符號型表示方式,改為實(shí)際的目錄路徑??梢圆捎弥苯踊蜷g接的方式指定執(zhí)行此程序的用戶,如未明白指定,則為當(dāng)前的用戶:

  • 命令:vi ~/.profile 與 vi $HOME/.profile 相同
  • 命令:vi ~root/.profile 編輯用戶 root 的.profile 文件

案例分析:第一個命令,shell 將 ~ 換成 $HOME,也就是當(dāng)前用戶的根目錄。第二個命令,則是 shell 在系統(tǒng)的密碼庫里,需找用戶 root,再將 ~root 置換為 root 的根目錄。

使用波浪號的好處:

  1. 這是一種簡介的概念表示方式
  2. 這可以避免在程序里把路徑名稱直接編碼,例如:

有一段 bash 腳本:

printf "enter username :"
read user
vi /home/$user/.profile 編輯該用戶的.profile 文件

這段程序假設(shè)所有用戶的根目錄都在 /home 之下。如果這又任何變動 (例如,用戶子目錄根據(jù)部門存放在部門目錄的子目錄下),那么這個腳本就得重寫。但如果使用波浪號展開,就能避免重寫的情況:

printf "enter username :"
read user
vi /home/$user/.profile 編輯該用戶的.profile 文件

這樣一來,無論用戶的根目錄在哪里,程序都能正常運(yùn)行了。

使用通配符

尋找文件名里的特殊字符,也是 shell 提供的服務(wù)之一。

基本的通配符

通配符
匹配
*
任何的字符串字符
[set]
任何在 set 里的字符
[!set]
任何不在 set 里的字符
?
任何的單一字符
  • ? 通配符匹配于任何的單一字符,所以如果你的目錄里含有 demo.ademo.b,demo.txt 這三個文件,與表達(dá)式 demo.? 匹配為 demo.a,demo.b,但是 demo.txt 則不匹配。
  • 星號 (*) 是一個功能強(qiáng)大的且廣為使用的通配符;它匹配于任何字符組成的字符串。使用表達(dá)式 demo.* 會匹配前面說的三個文件;網(wǎng)頁設(shè)計(jì)人員也可以用 *.html 表達(dá)式匹配他們的輸入文件。

set 結(jié)構(gòu)是一組組字符列表 (例如 abc),一段內(nèi)含的范圍 (如 a-z),或者是兩者的結(jié)合。如果希望破折號也是列表的一部分,只要把它放在第一個或最后一個就可以了。

使用 set 結(jié)構(gòu)的通配符

表達(dá)式
匹配的單一字符
[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.ademo.b,但是 demo.txt 則不匹配。
  • 在左方括號之后的感嘆號用來“否定” 一個 set。例如 [!.;] 符合句號和分號以外的任何一個字符;[!a-zA-Z] 符合任何一個非字母的字符。

范圍表示法固然方便,但不應(yīng)該對包含在范圍內(nèi)的字符有太多的假設(shè)。比較安全的方式是:分別指定所有大寫字母,小寫字母,數(shù)字,或任意的子范圍 (例如 [f-q].[2-6])。不要想在標(biāo)點(diǎn)符號字符上指定范圍,或是在混用字母大小寫上使用,像 [a-Z] 與 [A-z] 這樣的用法,都不能保證一定能確切的匹配出包括所有想要的字母,而沒有其他不想要的字符。更大的問題是在于:這樣的范圍在不同的類型之間的計(jì)算機(jī)之間無法提供完全的可移植性。

另一個問題是:很多國家默認(rèn)的系統(tǒng)語言環(huán)境與純粹的 ASCII 的字符集是不同的。為了解決這個問題,POSIX 標(biāo)準(zhǔn)提出了方括號表達(dá)式,用來表示字母,數(shù)字,標(biāo)點(diǎn)符號以及其他類型的字符,并且具有可移植性。在正則表達(dá)式下的方括號表達(dá)式里也出現(xiàn)相同的元素,它們可被用在兼容 POSIX 的 shell 內(nèi)的 shell 通配符模式中,不過應(yīng)該盡量避免將其應(yīng)用在需可移植的 shell 腳本里。

習(xí)慣上,當(dāng)執(zhí)行通配符展開時,linux shell 會忽略文件名開頭為一個點(diǎn)號的文件。像這樣的“點(diǎn)號文件” 通常用做程序配置文件或啟動文件 (一般都隱藏起來了,需要使用 ls -a 來查看)。像是 shell 的 $HOME/.profile,ex/vi 編輯器的 $HOME/.exrc,以及 bash 與 gdb 使用的 GNU readline 程序庫的 $HOME/.inputrc。

要看到這類文件,需要在模式前面明確的提供一個點(diǎn)號。例如: echo .* 顯示隱藏文件

注意:隱藏文件只是一個習(xí)慣用法。在用戶層面的軟件上他是這樣的,但核心程序 (kernel) 并不認(rèn)為開頭帶有一個點(diǎn)號的文件與其他文件有不同。