bash shell是如何识别特殊符号的

本文详细介绍了Bash Shell如何识别和处理特殊符号与通配符。内容包括Shell作为命令解释器的角色,命令解析过程,通配符的匹配规则,以及常见的元字符解释。通过阅读,读者可以了解Shell如何执行命令,以及如何正确使用通配符和元字符进行文件操作。

一 、 shell命令解析以及识别通配符

       Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行 。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

       shell是一个抽象概念,shell的一切操作都在计算机内部,负责处理人机交互,执行脚本等,是操作系统能正常运行的重要组 成部分
     shell在解释命令的过程中类似于编译器的预编译过程。shell对于输入的命令优先解释所有的特殊字符,再对转换完成的新命令行进行内核的系统调用。在输入命令的过程中,输入完命令直到按下enter的时候,然后shell才会以进程方式执行你所提交的命令,输入的命令的每一个charactor(字符)分为如下两种:
      *literal(文字):也就是普通纯文字,对shell来说没有特殊功能。
      *meta(元字符):对shell来说,具有特定功能的保留字。

     解释过程:  分割管道(将指令切成个别的命令,以哥哥命令进行以下解析)------》取出token(使用分割字符-----空格、tab或者eter将命令分割成token)---》替换别名(检查命令的第一个token是不是别名,若是则把别名替换成真正的命令)---》括号扩展

  (如ltouch  a{a,b}会扩展成 touch aa touch ab)---》符号扩展 如(~home 换成/root/home)---》替换变量(如$a换成 ab) ------>替换命令(若token含$(which cat)  则换成实际的/usr/bin/cat)-----》替换通配符(如*.sh换成a.sh,b.sh ) ---》替换算数(若有算数,则计算结果并替换)  执行已经替换完成的命令

   注:根据函数、内置命令、搜寻路径的顺序 找寻第一个token所代表的命令位于何处

      通配符是由shell处理的(不是由所涉及到命令语句处理的,其实我们在shell各个命令中也没有发现有这些通配符介绍), 它只会出现在 命令的“参数”里(它不用在 命令名称里, 也不用在 操作符上)。当shell在“参数”中遇到了通配符时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符 实际上就是一种shell实现的路径扩展功能。在 通配符被处理后, shell会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。

二、shell常见通配符以及元字符:

        通配符:

                *  匹配 0 或多个字符      ?  匹配任意一个字符     [lab]  匹配任意单一字符     [a-z]   a到z任意单一字符

                 {string1,string2,...}     匹配 sring1 或 string2其一字符串

        元字符:

              IFS    由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space )。绝大多数时候默认是采用空格作为分隔符,有                        些时候遇到制表符、换行符也会进行分隔。最典型的是"for i in a b c",它会分割变量列表"a b c"使其成为三个变                             量。这种分隔符是由IFS变量指定的。默认的IFS在碰到空格、制表符\t和分行符\n就会自动分隔进入下一步。但是                         对空格处理有点不一样,对行首和行尾两边的空格不处理,并且多个连续的空格默认当作一个空格。默认IFS("                              \t\n")的一个特殊性,它会忽略前导空白和后缀空白,并压缩连续空白
              CR    由 <enter> 产生。
               =    设定变量。
               $    作变量或运算替换(请不要与 shell prompt 搞混了)。
               >    重导向 stdout。 *
               <    重导向 stdin。 *
                |    命令管线。 *
              &    重导向 file descriptor ,或将命令置于背境执行。 *
              ( )    将其内的命令置于 nested subshell 执行,或用于运算或命令替换。 *
              { }    将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围。
               ;    在前一个命令结束时,而忽略其返回值,继续执行下一个命令。 *
             &&    在前一个命令结束时,若返回值为 true,继续执行下一个命令。 *
               ||    在前一个命令结束时,若返回值为 false,继续执行下一个命令。 *
               !    执行 history 列表中的命令。*

 三 、关闭元字符以及通配符的含义     

单引号,双引号,反斜杠。如要要让通配符,或者元字符变成普通字符,就需要用到转义符.
*hard quote:''(单引号) 又叫硬转义,其内部所有的shell 元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号),即使使用了反斜线转义也不允许
 *soft quote:""(双引号)又叫软转义,其内部只允许出现特定的shell 元字符:$用于参数代换 `用于命令代替,就是"\"、"$"、"`"(反引号)这3种特殊字符不被忽略。 如果开启了"!"引用历史命令时,则感叹号也除外。不忽略美元符号意味着shell在双引号内部也进行变量名替换
 *escape:\   (反斜杠) 又叫转义,去除其后紧跟的元字符或通配符的特殊意义。这只能对反斜线后一个字符进行转义
分隔符包括:空格、tab、分号、管道符号、&、&&、||、重定向符号、圆括号等

    

  四、awk、sed、grep等中的元字符问题

     grep:在命令中使用引号例如grep时,它的转义有两层,一层是shell本身的mate,这一层可以用echo命令测试输出,经过这                 一层转义之后的结果会进入grep命令,并在grep中进行第二层的转义,例如当grep利用双引号查找$时要将转义字符作                 为第二层转义的输入送到grep中,grep实际输入的应该是\$,这样才能查找到文件中的$字符,$对于grep来说有进行                   变量转换的内部功能,\在grep内还是转义功能,而"和'并不是grep的meta,因此不需要二层转义,是 否需要二层转                 义应该是根据不同命令的meta决定的

    awk: { } 是將其內一系列 命令 置于不具名的程序中执行可以说是匿名函数,但是awk 却需要用 { } 來区分出 awk 的命令区段                  (BEGIN, MAIN, END),如果不用hard quote'',由于  { } 在 shell 中并没关闭,那 shell 就將 {print $0} 视为 命令块 ,但                  同时又沒有" ; "符号作命令区隔,因此就出现 awk 的语法错误,如果使用 hard quote'',結果就是將原本的 {\,                                <space>、$0} 这几个 shell meta 关闭,避免掉在 shell 中遭到处理,而完整的成为 awk 参数中的 元字符,而其中的                    $0 是 awk 內建的 field number ,而非 awk 的变量,awk 自身的变量无需使用 $

              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤舞飘伶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值