1. 程式人生 > >shell指令碼【符號4】萬用字元的使用

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命令的用法