shell學習三十五天----波浪號展開與萬用字元

來源:互聯網
上載者:User

標籤: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學習三十五天----波浪號展開與萬用字元

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.