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

阅读更多

没有更多推荐了,返回首页