linux⽅括号作为通配符时的含义,linuxshell攻略下篇(1)shell是⽤户和Linux操作系统之间的接⼝。Linux中有多种shell,其中缺省使⽤的是Bash。本章讲述了shell的⼯作原理,shell的种
类,shell的⼀般操作及Bash的特性。
shell中的特殊字符
shell中除使⽤普通字符外,还可以使⽤⼀些具有特殊含义和功能的特殊字符。在使⽤它们时应注意其特殊的含义和作⽤范围。下⾯分别对这些特殊字符加以介绍。
1. 通配符
通配符⽤于模式匹配,如⽂件名匹配、路经名搜索、字符串查等。常⽤的通配符有*、?和括在⽅括号[ ]中的字符序列。⽤户可以在作为命令参数的⽂件名中包含这些通配符,构成⼀个所谓的“模式串”,在执⾏过程中进⾏模式匹配。
* 代表任何字符串(长度可以不等),例如:“f*”匹配以f打头的任意字符串。但应注意,⽂件名前的圆点(.)和路经名中的斜线(/)必须显式匹配。例如“*”不能匹配.file,⽽“.*”才可以匹配.file。
代表任何单个字符。
[] 代表指定的⼀个字符范围,只要⽂件名中[]位置处的字符在[]中指定的范围之内,那么这个⽂件名就与这个模式串匹配。⽅括号中的字符范围可以由直接给出的 字符组成,也可以由表⽰限定范围的起始字符、终⽌字符及中间的连字符(-)组成。例如,f [a- d] 与f [abcd]的作⽤相同。Shell将把与命令⾏中指定的模式串相匹配的所有⽂件名都作为命令的参数,形成最终的命令,然后再执⾏这个命令。
下⾯我们给出表10-1说明这些通配符的具体含义。
表10-1 通配符含义举例
模式串
意 义
*
当前⽬录下所有⽂件的名称。
*Text*
当前⽬录下所有⽂件名中包含有Text的⽂件的名称。
[ab-dm]*
当前⽬录下所有以a、b、c、d、m开头的⽂件的名称。
[ab-dm]?
当前⽬录下所有以a、b、c、d、m开头且后⾯只跟有⼀个字符的⽂件的名称。
/usr/bin/??
⽬录/usr/bin下所有名称为两个字符的⽂件的名称。
特别需要注意的是,连字符“-”仅在⽅括号内有效,表⽰字符范围,如在⽅括号外⾯就成为普通字符了。⽽*和?只在⽅括号外⾯是通配符,若出现在⽅括 号之内,它们也失去通配符的能⼒,成为普通字符了。例如,模式“- a[*?]abc”中只有⼀对⽅括号是通配符,*和?均为普通字符,因此,它匹配的字符串只能是- a*abc和- a?abc。、
最后说明⼀下使⽤通配符时需要注意的⼀些问题。由于*、?和[]对于shell来说具有⽐较特殊的意义,因此在正常的⽂件名中不应出现这些字符。特 别是在⽬录名中不要出现它们,否则Shell匹配起来可能会⽆穷的递归下去。另外要注意的⼀点是:如果⽬录中没有与指定的模式串相匹配的⽂件名,那么 Shell 将使⽤此模式串本⾝作为参数传给有关命令。这可能就是命令中出现特殊字符的原因所在。
2. 引号
在shell中引号分为三种:单引号,双引号和反引号。
由单引号括起来的字符都作为普通字符出现。特殊字符⽤单引号括起来以后,也会失去原有意义,⽽只作为普通字符解释。例如:
$ string=’$PATH’
$ echo $string
$PATH
$
可见$保持了其本⾝的含义,作为普通字符出现。
* 双引号 “
由双引号括起来的字符,除$、、’、和”这⼏个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。对于$来说,就是⽤其后指定的变 量的值来代替这个变量和$;对于⽽⾔,是转义字
符,它告诉shell不要对其后⾯的那个字符进⾏特殊处理,只当作普通字符即可。可以想见,在双引号中需要 在前⾯加上的只有四个字符$,,’和”本⾝。⽽对”号,若其前⾯没有加,则Shell会将它同前⼀
个”号匹配。
例如,我们假定PATH的值为.:/usr/bin:/bin,输⼊如下命令:
$ TestString=”$PATH”$PATH”
$ echo $TestString
.:/usr/bin:/ bin”$PATH
$
读者可以⾃⼰试⼀下在第⼆个双引号之前不加会产⽣什么结果。
* 反引号
反引号(`)这个字符所对应的键⼀般位于键盘的左上⾓,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令⾏,在执⾏时,shell⾸先执⾏该命令⾏,并以它的标准输出结果取代整个反引
号(包括两个反引号)部分。例如:
$ pwd
/home/xyz
$ string=”current directory is `pwd`”
$ echo $string
current directour is /home/xyz
$
shell执⾏echo命令时,⾸先执⾏`pwd`中的命令pwd,并将输出结果/home/xyz取代`pwd`这部分,最后输出替换后的整个结果。
利⽤反引号的这种功能可以进⾏命令置换,即把反引号括起来的执⾏结果赋值给指定变量。例如:
$ today=`date`
$ echo Today is $today
Today is Mon Apr 15 16:20:13 CST 1999
$
反引号还可以嵌套使⽤。但需注意,嵌套使⽤时内层的反引号必须⽤反斜线()将其转义。例如:
$ abc=`echo The number of users is `who| wc-l``
The number of users is 5
$
在反引号之间的命令⾏中也可以使⽤shell的特殊字符。Shell为得到``中命令的结果,它实际上要去执⾏``中指定的命令。执⾏时,命令中的特殊字符,如$,”,?等⼜将具有特殊含义,并且``所包含的可以是任何⼀个合法的Shell命令,如:
$ ls
Notice Unix.dir
$ TestString=”`echo $HOME ` ` ls [nN]*`”
$ echo $TestString
/home/yxz note Notice
$
其他情况,读者可⾃⾏试之。
1. 注释符
在shell编程中经常要对某些正⽂⾏进⾏注释,以增加程序的可读性。在Shell中以字符“#”开头的正⽂⾏表⽰注释⾏。
此外还有⼀些特殊字符如:⽤于输⼊/输出重定向与管道的、 >和|;执⾏后台命令的&;命令执⾏操作符&&和||及表⽰命令组的{}将在下⾯各⼩节中加以介绍。
标准输⼊/输出和重定向
1. 标准输⼊与输出
我们知道,执⾏⼀个shell命令⾏时通常会⾃动打开三个标准⽂件,即标准输⼊⽂件(stdin),通常对应
终端的键盘;标准输出⽂件 (stdout)和标准错误输出⽂件(stderr),这两个⽂件都对应终端的屏幕。进程将从标准输⼊⽂件中得到输⼊数据,将正常输出数据输出到标准输出 ⽂件,⽽将错误信息送到标准错误⽂件中。
我们以cat命令为例,cat命令的功能是从命令⾏给出的⽂件中读取数据,并将这些数据直接送到标准输出。若使⽤如下命令:
$ cat config
将会把⽂件config的内容依次显⽰到屏幕上。但是,如果cat的命令⾏中没有参数,它就会从标准输⼊中读取数据,并将其送到标准输出。例如:
$ cat
Hello world
Hello world
Bye
Bye
$
⽤户输⼊的每⼀⾏都⽴刻被cat命令输出到屏幕上。
另⼀个例⼦,命令sort按⾏读⼊⽂件正⽂(当命令⾏中没有给出⽂件名时,表⽰从标准输⼊读⼊),将其排序,并将结果送到标准输出。下⾯的例⼦是从标准输⼊读⼊⼀个采购单,并将其排序。
$ sort
bananas
carrots
apples
apples
bananas
carrots
$
linux重定向
这时我们在屏幕上得到了已排序的采购单。
直接使⽤标准输⼊/输出⽂件存在以下问题:
输⼊数据从终端输⼊时,⽤户费了半天劲输⼊的数据只能⽤⼀次。下次再想⽤这些数据时就得重新输⼊。⽽且在终端上输⼊时,若输⼊有误修改起来不是很⽅便。
输出到终端屏幕上的信息只能看不能动。我们⽆法对此输出作更多处理,如将输出作为另⼀命令的输⼊进⾏进⼀步的处理等。
为了解决上述问题,Linux系统为输⼊、输出的传送引⼊了另外两种机制,即输⼊/输出重定向和管道。
2. 输⼊重定向
输⼊重定向是指把命令(或可执⾏程序)的标准输⼊重定向到指定的⽂件中。也就是说,输⼊可以不来⾃键盘,⽽来⾃⼀个指定的⽂件。所以说,输⼊重定向主要⽤于改变⼀个命令的输⼊源,特别是改变那些需要⼤量输⼊的输⼊源。
例如,命令wc统计指定⽂件包含的⾏数、单词数和字符数。如果仅在命令⾏上键⼊:
$ wc
wc将等待⽤户告诉它统计什么,这时shell就好象死了⼀样,从键盘键⼊的所有⽂本都出现在屏幕上,但并没有什么结果,直⾄按下<
ctrl+d>,wc才将命令结果写在屏幕上。
如果给出⼀个⽂件名作为wc命令的参数,如下例所⽰,wc将返回该⽂件所包含的⾏数、单词数和字符数。
$ wc /etc/passwd
20 23 726 /etc/passwd
$
另⼀种把/etc/passwd⽂件内容传给wc命令的⽅法是重定向wc的输⼊。输⼊重定向的⼀般形式为:命令this text forms the content
>of the here document,which
>continues until the end of
>text delimter
>delim
4 17 98
在⽂件名。例如:
$ ls > directory.out
$ cat directory.out
ch1.doc ch2.doc ch3.doc chimp config mail/ test/
$
将ls命令的输出保存为⼀个名为directory.out的⽂件。
注:如果>符号后边的⽂件已存在,那么这个⽂件将被重写。
为避免输出重定向中指定⽂件只能存放当前命令的输出重定向的内容,shell提供了输出重定向的⼀种
追加⼿段。输出追加重定向与输出重定向的功能⾮ 常相似,区别仅在于输出追加重定向的功能是把命令(或可执⾏程序)的输出结果追加到指定⽂件的最后,⽽该⽂件原有内容不被破坏。
如果要将⼀条命令的输出结果追加到指定⽂件的后⾯,可以使⽤追加重定向操作符>>。形式为:命令>>⽂件名。例如:
$ ls *.doc>>directory.out
$ cat directory.out
ch1.doc ch2.doc ch3.doc chimp config mail/ test/
ch1.doc ch2.doc ch3.doc
$
和程序的标准输出重定向⼀样,程序的错误输出也可以重新定向。使⽤符号2>(或追加符号2>>)表⽰对错误输出设备重定向。例如下⾯的命令:
$ ls /usr/tmp 2> err.file
可在屏幕上看到程序的正常输出结果,但⼜将程序的任何错误信息送到⽂件err.file中,以备将来检查⽤。
还可以使⽤另⼀个输出重定向操作符(&>)将标准输出和错误输出同时送到同⼀⽂件中。例如:
$ ls /usr/tmp 2> err.file
利⽤重定向将命令组合在⼀起,可实现系统单个命令不能提供的新功能。例如使⽤下⾯的命令序列:
$ ls /usr/bin > /tmp/dir
$ wc –w
Linux shell下篇讲解到shell的特殊字符,通过这篇shell上下篇我们进⼀步了解linux shell,希望对⼤家有所帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论