歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

Linux Shell 通配符 / glob 模式

概念

glob 模式(globbing)也被稱之為 shell 通配符,名字的起源來自於 Unix V6 中的 /etc/glob (詳見 man 文檔)。glob 是一種特殊的模式匹配,最常見的是通配符拓展,也可以將 glob 模式設為精簡了的正則表達式,在最新的 CentOS 7 中已經刪除了 glob 的相關描述文檔,刪除的原因由於 glob 已經整合到了 shell 之中,然後就有了 shell 通配符。

筆者在查閱資料的時候發現關於 glob 模式或者 globbing 的相關描述以及文檔是少之又少,所以特地在這裡整理一下並重新寫一寫使用方法

shell 通配符 / glob 模式通常用來匹配目錄以及文件,而不是文本!!!

語法

字符解釋 * 匹配任意長度任意字符 ? 匹配任意單個字符 [list] 匹配指定范圍內(list)任意單個字符,也可以是單個字符組成的集合 [^list] 匹配指定范圍外的任意單個字符或字符集合 [!list] 同[^list] {str1,str2,...} 匹配 srt1 或者 srt2 或者更多字符串,也可以是集合

專用字符集

字符意義 [:alnum:] 任意數字或者字母 [:alpha:] 任意字母 [:space:] 空格 [:lower:] 小寫字母 [:digit:] 任意數字 [:upper:] 任意大寫字母 [:cntrl:] 控制符 [:graph:] 圖形 [:print:] 可打印字符 [:punct:] 標點符號 [:xdigit:] 十六進制數 [:blank:] 空白字符(未驗證)


在使用通配符的過程中可能會遇到文件名中包含了特殊字符的情況,例如

bash$:ls
a\b        a[123]b        A[abc]123        abc!123
a 12 b                #這是一個文件

在不使用專用字符集的情況下,需要使用轉義符來匹配,或者使用單引號將其框選。

這裡將 Linux shell 元字符列出,在使用通配符時如果沒有進行轉義可能就會被辨識為元字符

字符作用 IFS 由 < space > 或 < tab > 或 < enter > 三者之一組成 CR 由 < enter > 產生 = 設定變量 $ 作變量或運算替換 > 重導向標准輸出 < 重導向標准輸入 \   & 重導向文件描述符,或將命令靜默執行 ( ) 將其內的命令置於 nested subshell 執行,或用於運算或命令替換 { } 將其內的命令置於 non-named function 中執行,或用在變量替換的界定范圍 ; 在前一個命令結束時,而忽略其返回值,繼續執行下一個命令 && 在前一個命令結束時,若返回值為 true,繼續執行下一個命令 \ \ ! 執行 history 中的命令

第六行與倒數第二行居然錯誤了,看來博客園對 Markdown 的支持有待改進

第六行內容:“ | ”命令管線
倒數第二行內容:“ \ ” 在前一個命令結束時,若返回值為 false,繼續執行下一個命令

示例

這裡使用 /etc 下的文件為例

匹配以 a開頭,中間包含任意數量數字的文件

ls a*[0-9]*
#當然你是找不到的,因為通常情況下 /etc 下沒有以數字開頭的文件

匹配以任意小寫字母開頭,中間包含數字的文件

ls [[:lower:]]*[0-9]*
#相信你已經看到了一些文件,我們繼續

列出所有文件中以 init 開頭,英文結尾的文件

ls init*[a-z]

列出以 au,b,c 開頭的文件

ls {"au",[bc]}* 

更多的實例可以通過搜索引擎找到,這裡就不多說了

注意事項

  • 在使用專屬字符集的時候,字符集之外還需要用 [] 來包含住,否則專用字符集不會生效,例如 [[:space:]]
  • 想要轉義的時候,單引號與雙引號使用方法是不同的,單引號會轉義所有字符,而且單引號中間不允許再出現單引號,雙引號允許出現特定的 shell 元字符,具體字符可以自行查詢
  • 在使用花括號 {} 的時候,裡面的單個字符串需要使用單引號或者雙引號括住,否則就會視為多個的單個字符

Copyright © Linux教程網 All Rights Reserved