zoukankan      html  css  js  c++  java
  • Linux Bash之通配符

    通配符是我们在shell环境中不知不觉中都会用到的,有时甚至都不会考虑到去探究其实现过程,因为使用得太普遍了。而清晰地理解每一个过程,将有助于我们的分析和调试。

    说白了,通配符就是在 shell 环境下用来选择匹配给定模式的文件簇的特殊字符。下面是一段相对正式的定义,援引自https://bash.cyberciti.biz/guide/Wildcards

    Wildcards is one of the most important features of Bash shell. It allows you to select a group of files. For example you can select all C programming files in
    a GUI file manager with mouse. To select all C programming files in a Bash shell you use wildcards.
    In short wildcards are nothing but special characters that allows you to select a group of files that matches certain pattern.

    通配符一般只出现在命令的参数中,当 shell 在参数中遇到了通配符时,会将其当做路径或文件名区在磁盘上搜寻最可能的匹配,若符合要求的匹配存在,则进行代换,否则就将该通配符作为一个普通字符传递给命令,然后由命令进行处理。

    如下图1-1所示为 shell 进行命令行参数解析时的全过程,非常繁琐但很重要。

    shell命令行参数解析流程

    shell 常见通配符如表1所示。

    而除了有通配符之外,还有一系列特有的特殊元字符,如表2所示。这些元字符基本是作用在命令上面,用作多命令分割或参数分割。要注意这里的  {}  ,因为表1里面也有类似的字符,实际上他们的作用范围并不相同,因此不会出现混淆。

    metacharacter     A character that, when unquoted, separates words. One of the following: |  & ; ( ) < > space tab

    另外对于表1和表2中的特殊字符,如果我们想让其变成普通字符,就需要使用转义符,shell中提供三种转义符,如表3所示。

    There are three quoting mechanisms: the escape character, single quotes, and double quotes.
    
    A non-quoted backslash () is the escape character. It preserves the literal value of the next character that follows, with the exception of <newline>. If a <newline>
    pair appears, and the backslash is not itself quoted, the <newline> is treated as a line continuation (that is, it is removed from the input stream and effectively ignored).
    Enclosing characters in single quotes preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.
    
    Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of $, `, \, and, when history expansion is enabled, !.
    The characters $ and ` retain their special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: $, `, ", \, or <newline>. A double quote may be quoted within double quotes by preceding it with a backslash. If enabled, history expansion will be performed unless an ! appearing in double quotes
    is escaped using a backslash. The backslash preceding the ! is not removed.

    其中单引号与双引号的区别如下:

    • 单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动地使用,只是引号范围内不允许再引用单引号。
    • 双引号属于弱引用,它会对其中几个被引用起来的字符做特殊处理,其它的则忽略。例如:
      1. 其中  $  加变量名可以取变量的值;
      2. 反引号和  $()  括号里面的字符会被当做命令执行后替换原来的字符;
      3. 需要使用  $ ` "  时需要通过反斜杠转义。

    参考资料

    [1] shell脚本【命令解析过程】

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

  • 相关阅读:
    《C# to IL》第一章 IL入门
    multiple users to one ec2 instance setup
    Route53 health check与 Cloudwatch alarm 没法绑定
    rsync aws ec2 pem
    通过jvm 查看死锁
    wait, notify 使用清晰讲解
    for aws associate exam
    docker 容器不能联网
    本地运行aws lambda credential 配置 (missing credential config error)
    Cannot connect to the Docker daemon. Is 'docker daemon' running on this host?
  • 原文地址:https://www.cnblogs.com/phillee/p/11831778.html
Copyright © 2011-2022 走看看