<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ##shell十三問之14: [^ ] 跟[! ]差在哪? (wildcard) -------------------------------------- 這個題目說穿了, 就是要探討Wildcard與Regular Expression的差別的。 這也是很多初學shell的朋友很容易混淆的地方。 首先,讓我們回到十三問之第2問, 再一次將我們提到的command line format 溫習一次: ```shell command_name options arguments ``` 同時,也再來理解一下,我在第5章所提到的變量替換的特性: ```shell 先替換,再重組 command line! ``` 有了這個兩個基礎后,再讓我們來看Wildcard是什么回事吧。 ### Part-I Wildcard (通配符) --------------------------- 首先, ``` `Wildcard` 也是屬于 `command line` 的處理工序,作用于 `arguments` 里的 `path` 之上。 ``` 沒錯,它不用在`command_name`,也不用在`options`上。 而且,若argument不是path的話,那也與wildcard無關。 換句更為精確的定義來講, ``` `wildcard`是一種命令行的路徑擴展(path expansion)功能。 ``` 提到這個擴展,那就不要忘了 command line的“重組”特性了! 是的,這與`變量替換`(variable subtitution)及 `命令替換`(command substitution)的重組特性是一樣的。 也就是在`wildcard`進行擴展后, 命令行會先完成重組,才會交給shell來處理。 了解了`wildcard`的擴展與重組特性后, 接下來,讓我們了解一些常見的wildcard吧。 |wildcard | 功能 | |-----------|--------------------| | \* | 匹配0個或多個字符| | ? | 匹配任意單一字符| | [list] | 匹配list中任意單一字符| | [!list] | 匹配不在list中任意單一字符| | {string1,string2,...}| 匹配string1或者stsring2或者(...)中其一字符串| Note: list 中可以指定單個字符,如abcd, 也可以指定ASCII字符的起止范圍,如 a-d。 即[abcd] 與 [a-d] 是等價的,稱為一個自定義的字符類。 例如: ```shell a*b # a 與 b 之間可以有任意個字符(0個或多個),如aabcb, axyzb, a012b,ab等。 a?b # a 與 b 之間只能有一個字符,但該字符可以任意字符,如 aab, abb, acb, azb等。 a[xyz]b # a 與 b 之間只能有一個字符,但這個字符只能是x或者y或者z,如:axb, ayb, azb這三個。 a[!0-9]b# a 與 b 之間只能有一個字符,但這個字符不能是阿拉伯數字,如aab,ayb,a-b等。 a{abc,xyz,123}b # a 與 b之間只能是abc或者xyz或者123這三個字串之一,擴展后是aabcb,axyzb,a123b。 ``` 1. `[! ]` 中的`!` 只有放在第一位時,才有取反的功效。 eg: `[!a]*` 表示當前目錄下不以a開頭的路徑名稱; `/tmp/[a\!]*`表示/tmp目錄下所有以a 或者 ! 開頭的路徑名稱; 思考:為何!前面要加\呢?提示是十三問之4. 2. `[ - ]`中`-`左右兩邊均有字符時,才表示一個范圍,否則,僅作`-`(減號)字符來處理。 舉例: `/tmp/*[-z]/[a-zA-Z]*` 表示/tmp 目錄下所有以z或者-結尾的子目錄中, 以英文字母(不分大小寫)開頭的目錄名稱。 3. 以\*或?開頭的wildcard不能匹配隱藏文件(即以.開頭的文件名)。 eg: `*.txt`并不能匹配`.txt`但能匹配1.txt這樣的路徑名。 但1*txt及1?txt均可匹配1.txt這樣的路徑名。 基本上,要掌握wildcard并不難, 只要多加練習,再勤于思考,就能靈活運用了。 再次提醒: ``` 別忘了wildcard的"擴展" + "重組" 這個重要特性,而且只作用在 argument的path上。 ``` 比方說, 假如當前目錄下有: a.txt b.txt c.txt 1.txt 2.txt 3.txt 這幾個文件。 當我們在命令行中執行`ls -l [0-9].txt`的命令行時, 因為wildcard處于argument的位置上, 于是根據匹配的路徑,擴展為: 1.txt 2.txt 3.txt, 在重組出`ls -l 1.txt 2.txt 3.txt` 這樣的命令行。 因此,你在命令行上敲 `ls -l [0-9].txt` 與 `ls -l 1.txt 2.txt 3.txt` 輸出的結果是一樣, 原因就是在于此。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看