<i id='owup4'><div id='owup4'><ins id='owup4'></ins></div></i>

    <fieldset id='owup4'></fieldset>

  1. <tr id='owup4'><strong id='owup4'></strong><small id='owup4'></small><button id='owup4'></button><li id='owup4'><noscript id='owup4'><big id='owup4'></big><dt id='owup4'></dt></noscript></li></tr><ol id='owup4'><table id='owup4'><blockquote id='owup4'><tbody id='owup4'></tbody></blockquote></table></ol><u id='owup4'></u><kbd id='owup4'><kbd id='owup4'></kbd></kbd>
    <span id='owup4'></span>
        1. <i id='owup4'></i>
          <acronym id='owup4'><em id='owup4'></em><td id='owup4'><div id='owup4'></div></td></acronym><address id='owup4'><big id='owup4'><big id='owup4'></big><legend id='owup4'></legend></big></address>
          <dl id='owup4'></dl>

          <code id='owup4'><strong id='owup4'></strong></code>
          <ins id='owup4'></ins>

          Linux Shell 通配符、元字符、转义符使用实例介绍

          • 时间:
          • 浏览:9
          • 来源:124软件资讯网

              下面是一个实例:

              代码如下:

              [chengmo@localhost ~/shell]$ ls

              a.txt b.txt c.old

              #2

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

              a.txt b.txt

              #3

              [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常见通配符:

            字符寄义实例
            *匹配 0 或多个字符a*b a与b之间可以有恣意长度的恣意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab  。
            ?匹配恣意一个字符a?b a与b之间必须也只能有一个字符, 可以是恣意字符, 如aab, abb, acb, a0b  。
            [list]匹配 list 中的恣意单一字符a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb  。
            [!list]匹配 除list 中的恣意单一字符a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b  。
            [c1-c2]匹配 c1-c2 中的恣意单一字符 如:[0-9] [a-z]a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b... a9b  。
            {string1,string2,...}匹配 sring1 或 string2 (或更多)其一字符串a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一  。

              需要说明的是:通配符看起来有点象正则表达式语句 ,可是它与正则表达式差别的  ,不能相互混淆 。把通配符明白为shell 特殊代号字符就可  。而且涉及的只有  ,*,? [] ,{} 这几种  。

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

              shell 除了有通配符之外  ,由shell 卖力预先先剖析后  ,将处置惩罚效果传给下令行之外  ,shell另有一系列自己的其他特殊字符 。

            字符说明
            IFS 三者之一组成(我们常用 space )  。
            CR 发生  。
            =设定变量  。
            $作变量或运算替换(请不要与 shell prompt 搞混了) 。
            >重导向 stdout  。 *
            <重导向 stdin  。 *
            |下令管线  。 *
            &重导向 file descriptor  ,或将下令置于背境执行  。 *
            ( )将其内的下令置于 nested subshell 执行  ,或用于运算或下令替换  。 *
            { }将其内的下令置于 non-named function 中执行 ,或用在变量替换的界定规模  。
            ;在前一个下令竣事时  ,而忽略其返回值 ,继续执行下一个下令 。 *
            &&在前一个下令竣事时  ,若返回值为 true  ,继续执行下一个下令  。 *
            ||在前一个下令竣事时  ,若返回值为 false ,继续执行下一个下令  。 *
            !执行 history 列表中的下令  。*

              加入”*” 都是作用在下令名直接  。可以看到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提供转义符有三种  。

            字符说明
            ‘’(单引号)又叫硬转义  ,其内部所有的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步  。也就是说  ,双引号 只经由参数扩展、下令代换和算术代换就可以送入执行步骤 ,而单引号转义符直接会被送入执行步骤 。而且  ,无论是双引号转义符照旧单引号转义符在执行的时间能够告诉各个下令自身内部是一体的  ,可是其自己在执行时是并不是下令中文本的一部门  。