ITPub博客

首页 > Linux操作系统 > Linux操作系统 > bash's history(3)

bash's history(3)

原创 Linux操作系统 作者:myyu 时间:2008-04-12 21:49:59 0 删除 编辑
文件名、通配符、路径名扩展
有时候你需要在不止一个文件上执行命令,这类命令的最好的一个例子就是'ls'。在ls的最简答方式中,没有任何的选项,它用来列举出除了隐藏文件以外的所有文件的名字。
如果在ls中指定了文件名参数,那么就会只显示这些文件的信息。实际上,ls更多的时候是被带选项使用的,例如加上-l选项,来告诉ls列举出更加详细的信息,或者加上-a选项,列举出所有的文件名,当然也包含上面描述的隐藏文件。然而,有时候你需要确认一些文件的存在性,而不需要知道所有这些文件的名字。例如,你想知道你的当前目录下是否有以txt结尾的文件。
文件名在unix系统是如此的重要,以至于shell会提供一种内置命令的方式来指定一组文件名的pattern, 而不需要知道所有的文件名。你可以通过指定文件名中的字符(通配符,wildcards)来使他们进入到此种模式中。
wildcards              matches
?                      any single character
*                      any string of characters
[set]                  any character in set
[!set]                 any character not in set
'?'通配符匹配一个单个的字符,所以如果你的目录中包含了yuyj.c, yuyj.o, yuyj.log,那么你指定yuyj.?, 那么它就会匹配yuyj.c和yuyj.o,而不会匹配yuyj.log。
'*'的功能更加强大,适用的时候也是最多的。它匹配任何由字符组成的字符串。那么你指定yuyj.*, 那么它就会匹配yuyj.c、yuyj.o和yuyj.log。
剩下来的通配符方式就是set结构体方式了,一个set结构是一系列字符的罗列(例如abcd)、一个包含的范围(a-c),或者是两者的组合。
expression             matches
[abc]                  a、b or c
[.,;]                  '.'、',' or ';'
[-_]                   '-' or '_'
[a-c]                  a、b or c
[a-z]                  所有的小写字母
[!0-9]                 非数字
[0-9!]                 数字或者!
[a-zA-Z]               所有的大小写字符
[a-zA-Z0-9_-]          所有的大小写字符,数字,-或者_
通常情况下,yuyj.[co] or yuyj.[a-z]都会匹配yuyj.c、yuyj.o,但是都不会匹配yuyj.log
紧挨着最左边的中括号的感叹号是对于set结构的一个negate(否定)。例如[!,;]就是非字符','和';';[!a-zA-Z]就是非大小写字符。为了match '!'本身,需要把感叹号放置于set结构中的第一个字符的后面(后面几个都行,只要不是第一个)或者使用'\!'来表达。
范围符号(range notation)是唾手可得的,然而你不应该在你的范围中包含太多的不精确假设。使用大写字符、小写字符、数字、等等是非常安全的。不应该在标点字符或者混合式的字符串(e.g.)中使用范围式的通配符。[a-Z]或者[A-z]不应该被认为是包含了所有的字符。问题的根本原因是在不同的unix版本或者系统中,此类的范围是不可移植的---特殊指明,range必须依靠具体的计算机的编码方式和现场环境所用的character set具体结构。
通配符匹配通常是shell读入和处理命令行的许多步骤中的一步。然而,有一点我们必须要特别的注意,你所执行的命令只是看见了通配符匹配的结果。也就是说,它只是见到了一系列的参数变量信息,他们是不知道这些变量参数信息是如何得到的、从那里得到的。例如,你运行了ls f*,在目录下存在file、fii、ok三个文件,那么file和fii会显现出来,then the shell 将会把command line to “ls file fii”,并且调用ls命令和他的参数变量信息file、fii。如果你输入ls j*,那么ls将会被僵死的传入j*这个参数,而显示为报错信息:没有此文件或者目录。
这里有一个例子可以使它变得更加容易理解。假设你是一个C程序员,你编辑了c文件、h文件和o文件,当然还有一系列其他的文件。你想看一下你的当前目录下所有的源文件、头文件和对象文件。命令行ls *.[cho]能够达到此效果,shell扩展*.[cho]到所有以.h、.c和.o结尾的文件中,并把这些文件作为结果传递到ls命令中---作为lls的参数变量信息。换句话说,ls所见到的变量参数是一个个的完整的文件名,就好像单个手工输入的一样---但是需要注意的是我们是无论如何也不知道具体的文件名的。我们只是用通配符来做这件事情。
 brace 扩展---大括号扩展
一个与路径名扩展十分接近的概念是brace扩展。然而与pathname 扩展扩大到已经存在的file和directoriese不同,brace 扩展适用于给出的严格的字符串格式:一个可选择的前缀,接着是大括号包含起来的以逗号分割的字符串,最后是可选择的后缀字符串。例如你打印echo b{ed,jj,hh}c,那么你将看到bedc,bjjc,bhhc被打印出来。括号内的每一个所列举的事例都被前缀b和后缀c拼接为一个整体的字符串。请注意:这些字符串并不是文件名本身,字符串是严格独立于文件名的。当然你也可以嵌套使用括号,例如b{ar{z,x,c},aa,ss}d。
ok!当然你也可以使用一个苗条一些的格式来创建一系列数字或者字符的序列。如果你敲入c{2..5}那么它将被扩展为c2,c3,c4,c5。
大括号扩展可以和通配符方式一同使用,例如:ls *.{a,s,d}。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13710953/viewspace-235577/,如需转载,请注明出处,否则将追究法律责任。

上一篇: bash's history(2)
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2008-04-02

  • 博文量
    4
  • 访问量
    4660