前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在Linux上的Shell编程(2)

在Linux上的Shell编程(2)

作者头像
云深无际
发布2021-04-14 14:00:50
7800
发布2021-04-14 14:00:50
举报
文章被收录于专栏:云深之无迹

我一直以为现在是8点,一看表都11点半了,愁。我写到12点然后就发。

星号

小姐姐的照片一张

在UNIX系统中,Shell拥有一个强大的特性:文件名替换。假设你的当前目录下有以下文件:

代码语言:javascript
复制
 $ ls
        chaptl
        chapt2
        chapt3
        chapt4
        $

如果你想同时显示这些文件的内容的话,很简单:cat命令能够显示出在命令行中所指定的多个文件的内容。就像这样:

代码语言:javascript
复制
 $ cat chaptl chapt2 chapt3 chapt4
              .
        $

但是这种方法太麻烦了。你可以借助于文件名替换,只需要简单地输入:

代码语言:javascript
复制
$ cat *
            ...
        $

Shell会自动将模式 *替换成当前目录下能够匹配到的所有文件名。如果你在其他命令中使用 *,相同的替换过程一样会发生。那么echo命令呢?

代码语言:javascript
复制
$ echo *
        chaptl chapt2 chapt3 chapt4
        $

在这里,*又一次被替换成当前目录中的所有文件名,然后用echo命令显示出了这些文件名。

命令行中只要是 *出现的地方,Shell都会进行替换:

代码语言:javascript
复制
$ echo *: *
        chaptl chapt2 chapt3 chapt4 : chaptl chapt2 chapt3 chapt4
        $

*能够实现部分文件替换功能,它实际上还可以与其他字符配合使用,以限制所能够匹配到的文件名范围。

举例来说,假设在当前目录下不仅有chapt1~chapt4这些文件,还包括文件a、b和c:

代码语言:javascript
复制
$ ls
        a
        b
        c
        chaptl
        chapt2
        chapt3
        chapt4
        $

要想只显示出以chap开头的文件,可以输入:

代码语言:javascript
复制
$ cat chap*
              .
              .
              .
        $

chap *能够匹配以chap开头的所有文件。在指定的命令被调用之前,这些文件名替换就已经完成了。

*并不仅限于放在文件名尾部,它还可以出现在开头或中间的位置:

代码语言:javascript
复制
        $ echo *t1
        chaptl
        $ echo *t*
        chaptl chapt2 chapt3 chapt4
        $ echo *x
        *x
        $

在第一个echo中,*t1指定了所有以字符t1作为结尾的文件名。在第二个echo中,首个*能够匹配t字符之前的任意多个字符,另一个*匹配t之后的任意多个字符,因此,只要包含t的文件名,就会被打印出来。因为

没有以x作为结尾的文件名,所以最后一个例子中并没有发生替换,echo命令也就只是显示出了*x。

1.4.2 匹配单个字符

星号(*)能够匹配零个或多个字符,也就是说,x*能够匹配文件x,也能够匹配x1、x2、xabc等。问号(?)仅能够匹配单个字符。因此cat ?能够显示出所有文件名中只有单个字符的文件,而cat x?则会显示出文件名长度为两个字符且第一个字符是x的所有文件。我们再一次用echo来演示这种匹配行为:

代码语言:javascript
复制
        $ ls
        a
        aa
        aax
        alice
        b
        bb
        c
        cc
        report1
        report2
        report3
        $ echo ?
        a b c
        $ echo a?
        aa
        $ echo ??
        aa bb cc
        $ echo ??*
        aa aax alice bb cc report1 report2 report3
        $

在上面的例子中,??匹配两个字符,*匹配余下的零个或多个字符,其效果就是找出所有文件名长度至少为两个字符的文件。

另一种匹配单个字符的方法是在中括号[]中给出待匹配的字符列表。例如,[abc]能够匹配字符a、b或c。这类似于?,但是允许你选择具体要匹配哪些字符。

你可以使用破折号指定一个字符的逻辑范围,这可是太方便了!例如,[0-9]能够匹配字符0~9。在指定字符范围的时候,唯一的限制就是第一个字符在字母表上必须位于最后一个字符之前,因此[z-f]并不是一个有效的字符范围,而[f-z]就没有问题。

可以通过配合使用字符范围以及字符列表来实现复杂的替换。例如,[a–np–z]*能够匹配以字母a~n或者p~z开头的所有文件(或者说得再简单些,就是不以小写字母o开头的文件)。

如果[之后的第一个字符是!,那么所匹配的内容正好相反。也就是说,匹配中括号内容之外的任意字符。因此:

[!a–z]

能够匹配小写字母以外的任意字符,另外:

*[!o]

能够匹配不以小写字母o结尾的那些文件。

表1.1给出了文件名替换的另外一些例子。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档