歡迎光臨
每天分享高質量文章

Linux Shell 通配符、元字符、轉義符最全使用攻略

來自:程默 – 博客園,作者:程默

www.cnblogs.com/chengmo/archive/2010/10/17/1853344.html

說到shell通配符(wildcard),大家在使用時候會經常用到。下麵是一個實體:

[chengmo@localhost ~/shell]$ ls

a.txt b.txt c.old

[chengmo@localhost ~/shell]$ ls *.txt

a.txt b.txt

[chengmo@localhost ~/shell]$ ls d*.txt

ls: 無法訪問 d*.txt: 沒有那個檔案或目錄

從上面這個實體,不知道大家有沒有發現問題呢。我們先瞭解一下,通配符相關知識,再分析下這個實體吧。

一、linux shell通配符(wildcard)

通配符是由shell處理的(不是由所涉及到命令陳述句處理的,其實我們在shell各個命令中也沒有發現有這些通配符介紹), 它只會出現在 命令的“引數”里(它不用在 命令名稱里, 也不用在 運算子上)。當shell在“引數”中遇到了通配符時,shell會將其當作路徑或檔案名去在磁盤上搜尋可能的匹配:若符合要求的匹配存在,則進行代換(路徑擴展);否則就將該通配符作為一個普通字符傳遞給“命令”,然後再由命令進行處理。總之,通配符 實際上就是一種shell實現的路徑擴展功能。在 通配符被處理後, shell會先完成該命令的重組,然後再繼續處理重組後的命令,直至執行該命令。

我們回過頭分析上面命令吧:在第2個命令中,*.txt 實際shell搜索檔案,找到了符合條件的檔案,命令會變成:ls a.txt b.txt ,實際在執行ls 時候傳給它的是a.txt b.txt .

而命令3,d*.txt 由於當前目錄下麵沒有這樣的檔案或目錄,直接將”d*.txt” 作為ls 引數,傳給了 ls .這個時候”*” 只是一個普通的 ls 引數而已,已經失去了它通配意義。 由於找不到檔案,所以會出現:無法訪問提示!

瞭解了shell通配符,我們現在看下,shell常見通配符有那一些了。

shell常見通配符:

需要說明的是:通配符看起來有點象正則運算式陳述句,但是它與正則運算式不同的,不能相互混淆。把通配符理解為shell 特殊代號字符就可。而且涉及的只有,*,? [] ,{} 這幾種。

二、shell元字符(特殊字符 Meta)

shell 除了有通配符之外,由shell 負責預先先解析後,將處理結果傳給命令列之外,shell還有一系列自己的其他特殊字符。

加入”*” 都是作用在命令名直接。可以看到shell 元字符,基本是作用在命令上面,用作多命令分割(或者引數分割)。因此看到與通配符有相同的字符,但是實際上作用範圍不同。所以不會出現混淆。

以下是man bash 得到的英文解析:

metacharacter

A character that, when unquoted, separates words.  One of the following:

|  & ; ( ) < > space tab

control operator

A token that performs a control function.  It is one of the following symbols:

|| & && ; ;; ( ) |

三、shell轉義符

有時候,我們想讓 通配符,或者元字符 變成普通字符,不需要使用它。那麼這裡我們就需要用到轉義符了。 shell提供轉義符有三種。

man bash 英文解釋如下:

There are three quoting mechanisms: the escape character, single quotes, and double quotes.

實體:

[chengmo@localhost ~/shell]$ ls *.txt

ls: 無法訪問 *.txt: 沒有那個檔案或目錄

[chengmo@localhost ~/shell]$ ls ‘*.txt’

ls: 無法訪問 *.txt: 沒有那個檔案或目錄

[chengmo@localhost ~/shell]$ ls ‘a.txt’

a.txt

[chengmo@localhost ~/shell]$ ls *.txt

a.txt b.txt

可以看到,加入了轉義符 “*”已經失去了通配符意義了。

四、shell解析腳本的過程

看到上面說的這些,想必大家會問到這個問題是,有這麼想特殊字符,通配符,那麼 shell在得到一條命令,到達是怎麼樣處理的呢?我們看下下麵的圖:

如果用雙引號包括起來,shell檢測跳過了1-4步和9-10步,單引號包括起來,shell檢測就會跳過了1-10步。也就是說,雙引號 只經過引數擴展、命令代換和算術代換就可以送入執行步驟,而單引號轉義符直接會被送入執行步驟。而且,無論是雙引號轉義符還是單引號轉義符在執行的時候能夠告訴各個命令自身內部是一體的,但是其本身在執行時是並不是命令中文本的一部分。

本系列:


《Linux雲計算及運維架構師高薪實戰班》2018年11月26日即將開課中,120天衝擊Linux運維年薪30萬,改變速約~~~~

    *宣告:推送內容及圖片來源於網絡,部分內容會有所改動,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯繫我們刪除或授權事宜。

    – END –


    赞(0)

    分享創造快樂