shell指令碼【符號4】萬用字元的使用
這篇部落格介紹
1、萬用字元的使用,用於對“檔案”的檢索
2、“[ ]”和“[[ ]]” 的其它用法(作為test命令的簡寫)
萬用字元: * ? [ ] [ ! ] [^ ]
正文:
一:使用元字元進行模式匹配,搜尋檔案
⒈ 按照匹配的字元數量,這些萬用字元大致分為兩類:
一類是匹配任意數量的字元:*
一類是匹配單個數量的字元:? [ ] [ ! ] [^ ]
⒉ 在匹配單個數量字元的萬用字元中,按照匹配的範圍,可分為:
任意匹配:?
都是加了範圍的匹配:[ ] [! ] [^ ]
⒊ 八種典型應用舉例:
①、命令:ls –l [a-c]*
必須說明一下,符號“[ ]”中間的字母順序是aAbBcCdD……
比如,上面的 [a-c],截斷的就是 aAbBc ,沒有大寫的C
所以,表示的是:頭字元是a,A,b,B,c中間的一個的檔案
如果是[A-C],截斷的就是 AbBcC。沒有小寫的a
②、命令:ls –l musi? (匹配music檔案(只是一個例子))
只匹配最後一個字元。當然可以匹配任意位置的字元
?用來匹配單個字元,還可以用這種:ls –l m?s??
注意的就是“?”用來匹配單個字元
③、命令:ls –l [su]*
列出當前目錄中以s或u為首字元的所有檔案
[ ] 是用於限定搜尋單個字元的範圍
擴充套件:
ls -l [a-Z0-9]*
分析:[ ]用來匹配一個字元。裡面包含的都是單個字元的備選字元,包括所有大小寫字母或數字0-9開頭的檔案。
結合第①條和第③條,你會有疑問,怎樣才能單獨匹配到小寫字母或大寫字母:
④、命令:ls –l s* u*
中間有空格,表示列出當前目錄中以s為首字母 和 以u為首字母的所有檔案
⑤、命令:ls –l s*u*
s*u*中間不加空格
匹配以s為首字母,中間有u字母的所有檔案
*可以出現在任何位置,比如:echo *.c
其實上一句沒有什麼特別的含義,“.c”也只是檔名的一部分,非字尾
並且注意和第4條的對應
⑥、命令:ls –l [ ! a-Z]*
符號“!”表示取反,不取任何以字母開頭的檔案
這條命令和命令:ls –l [^a-Z]* 是一樣的
!和^在這個裡面作用是一樣
注意和第1條對應
⑦、命令:ls –l ? 或 ls –l *
作用: 一個是輸出檔名只有一個字元的檔案
一個是輸出目錄下所有的檔案
注意的點是:如果匹配不到檔案,比如當前目錄為空。則?和*會直接傳給命令作為輸入引數。
問:為什麼要注意直接傳入問題?以下面例子為例
例子:echo xx\\*\*yy
輸出:xx\**yy
分析:輸出的\是由\\輸出列印的,輸出的第二個*是由\*輸出列印的,中間的*,可能就是一個*,因
為沒有匹配檔案,所以原樣輸出了。至於對不對,在下面有校驗:
校驗:可以使用一個例子來檢驗一下分析是否正確
建立檔案:echo hello >tes*abcd*yy
進行檢測:echo tes\**\*yy; echo tes\\*\*yy
輸出:tes*abcd*yy (匹配了檔案)
tes\**yy (\\和\*輸出了,至於中間這個*,保持原樣)
結論:上面分析是對的
⑧、命令:echo .*
作用:匹配以”.”為起始字元的隱藏檔名,列出所有的隱藏檔案
二:當作一種命令---test命令的簡寫
test命令
⑴ 作用:用來檢測檔案屬性和狀態,比較兩檔案的區別;字串操作,字串比較;數值比較,表示式比較,最終返回出口狀態(0或1)。
⑵ 為什麼test命令非常適合作為控制迴圈結構的判斷命令:
方便的檔案、字元、數值間比較功能,以及出口狀態的返回值是它非常適合作為判斷條件語句的根本原因。
至於詳細操作,可以通過help test >testManual,詳細檢視test命令的各種operators.
⑶ test命令的簡寫:[ ]或 [[ ]]
就是把test命令後面的operators,用方括號闊起來罷了。
注意:方括號內側和表示式之間必須要加空格
在shell指令碼中,需要使用[[ ]],因為有時可以避免邏輯錯誤。
“[[ ]]” 中可以使用“&&”,“||”,“<”,“>”等運算子;但在“[ ]”中,使用這些運算子就會出錯。
⑷ 舉例:
功能:測試[[ ]]的功能
程式碼:
while $([[ m = m ]])
do
echo hello
done
分析:[ m = m ]也是命令,所以可以用$( )進行命令替換
注意的是:while檢測的是命令的出口狀態。所以:
① while [[ m = m ]] ② while `[[ m = m ]]` ③ while $([[ m = m ]])是一樣的。
其中②是反引號。上面三種對於while檢測來說是一模一樣的。②③這兩種,甚至可以說他們寫法有點多餘。因為,完全不需要做引用或命令替換。引用或命令替換是發生在一些命令在雙引號裡面或echo命令或其它地方,命令可能不執行的情況,但又需要它執行,並引用命令的標準輸出的情況。測試語句又沒有標準輸出,只有狀態輸出,所以,用命令替換有點多餘。
test命令的詳細解析可以看另一篇文章:test命令的用法