第二章:Shell基础知识
一、 特殊符号
在Shell中有一些符号具有特殊的含义,可以用来实现某些功能,现叙述如下:
1、星号(*):可以匹配任何字符串,包括空串。如:echo * 命令将显示当前目录下的所有文件和目录名,lf aa* 将显示所有以aa开头的文件名。使用 * 做匹配符时,应特别小心,如rm * 将删除目录下的所有文件。
2、问号(?):可以匹配文件名中的任何单个字符。如用lf a??d 命令来显示当前目录下的文件时,其结果可能为:abcd、aacd、aaad等。
3、中括号([]):可以匹配一个集合的元素。如果[crf]作为一个文件名模式的一部分,Shell将可以查到指定位置的字母为c、r或f的文件名。例如:lf [crf]at 命令的结果可能为:cat、fat、rat等。
中括号也能用于指定的一个字符域,无论是数字还是字母。如:lf chapter[1-9] 其结果将是可能存在的chapter1,chapter2...等文件名。
4、后台执行符号(&):如果一个程序运行的时间很长,并且不是一个交互式
程序的话,就可以用 & 号使程序以后台的形式执行。其格式为:command &。
5、分号(;):可以让你在一个命令行或程序的一行中执行多个命令。例如:
#cd;pwd。
6、反斜杠(\):用于取消特殊字符的特殊含义。例如:lf aa\* 命令将查找
当前目录是否有名为aa*的文件,与lf aa* 命令的含义截然不同。
7、单引号(‘ ’):取消除单引号以外的任何字符的特殊含义。例如:echo
‘my name is $name’其结果为:my name is $name,此时$只作为一个普
通字符使用了。
8、双引号(“ ” ):取消除双引号、$号以及_号以外的所有字符的特殊含
义。单引号更加具有强制性。
9、输入转向符(<):用于指定输入的设备或文件。如:mail root
则将文件message的内容发送给root。
10、输出转向符(>):用于将输出发送到指定的设备或文件中。如:lf>myfile
其结果是将lf的执行结果放到文件myfile中(同时清空文件中原有的数
据),而不显示到屏幕上。又如:将错误输出到重定向到空设备 2>/dev/null。
11、追加符号(>>):用于将命令的输出追加到某个文件中。如:lf >>myfile
其结果是将lf的执行结果追加到文件myfile中(文件原有的数据予以保
留),而不显示到屏幕上。
12、管道符号(|):可以将一个命令的输出作为另一个命令的输入,而不需建
立临时文件,以这样的方式建立的多命令行称为管道线。如:ls|more
将ls 的结果传递给more,由more来分屏显示。
13、改向符号(<<):常用于建立一个here文件。
14、&&和||:其作用是使命令有条件的执行。如:
command1 && command2:当且仅当command1执行成功后才执行command2
command1 || command2:当且仅当command1执行失败后才执行command2
二、 变量
Shell的变量不分类型,或者说只有字符串型变量,所以要使用数值运算则必须靠外部命令达到目的。而其变量种类有以下几种:
1、用户自定义变量
在Shell中,这是最常用的变量,在程序中变量不需要事先说明,没有类型之分,也没有全程、局部的区别。变量可以随时随地定义,其名称是以字母开头的不包括空白字元的任何字符串,长度不限。其使用范围只限于程序运行期间,程序执行完毕,该变量即不复存在。
定义变量的格式: 变量名=字符串 (例:name=Tom)
其中,字符串可以是空串,表示变量被赋予空值。
引用一个变量时,在变量前加一$号即可。
Name=Tom (变量name被赋予字符串值Tom)
echo $name (显示变量name的值)
执行结果为:Tom
2、系统变量(环境变量)
和自定义变量相似,系统变量只不过是在用户注册到系统的时候,由
系统自动赋值的,并且它的值会自动传递到各层Shell并能够被其所执行的
程序所调用。除非在程序中对环境变量进行修改,否则其值不会随Shell
程序的运行而改变,要将一个用户自定义变量设定为环境变量,只需用
export命令声名即可,例如:
name=Tom
export name
以下是用户一进入系统之后就已设定好的环境变量:
$HOME:用户自己的主目录
$PATH:执行命令时所搜寻的目录
$TZ :时区
$PS1 :命令行上的提示符
$PS2 :当命令尚未书完时,Shell要求继续输入时的提示符
3、特殊变量
有些变量一开始执行Shell程序时就被自动设定的,一般不能进行修改,以下是一些特殊变量:
$0 Shell程序的执行名
$n Shell程序(或过程)的第n个位置参数值,n=1..9
$* Shell程序所有位置参数组成的字符串
$# Shell程序的位置参数的个数
$$ 程序执行后的进程号
$! 最后一个后台指令(程序)执行后的进程号
$? 命令执行后的返回值,返回0表示成功,返回1表示失败
其中,$n又叫位置变量,它是调用(运行)一个Shell程序时,跟在程序名后面的各个参数,最多可以有10个,例如:
#sh myprogram 15 20
则在程序中$1=15,$2=20
当你执行Shell时,如果参数的数目超过9个时,可以使用Shift命令将参数向前移动一格,如此便可以使用超过9个的参数。
三、 输入输出语句
1、read 语句
read语句用于从键盘接收一个或多个值并把它们赋予相应的变量。
用法:read 变量名1 [变量名2,变量名3...]
例如:read a b
echo $a
echo $b
运行并输入 aaa bbb 回车后将显示:
aaa
bbb
需要注意的是,如一次需输入多个值,每个值之间要以空格来分隔,全
输入后再打回车确认。
如输入的字段值个数少于语句中变量的个数时,多出的变量将赋予空值。
如输入的字段值个数多于语句的变量个数时,多出的参数值被丢弃。
通常使用的方式是一次读入一个数据 ,即read 后只跟一个变量。
2、echo 语句
echo 语句用于向标准输出设备输出字符串或变量的值。
用法:echo 字符串 或 echo 变量名1[变量名2,变量名3...]
例如:echo I am a student
echo 语句中还可以用一些控制字符对格式进行控制,常用如下:
\b 空一格,是显示行首为一个空格
\c 显示后不换行,下次显示时紧跟其后显示
\f 先清屏后在屏幕顶端显示
\n 换行,显示后多增加一空行
\r 回车
\t 显示时增加一个制表符
\v 垂直制表符
\\ 显示一个反斜杠
四、 赋值语句
1、字符串:是最常用的赋值方法,等号后面跟一个后多个字符串。
如:name=John
name=”John Tom”
2、read 语句:把键盘输入的值赋予变量。
如:read key (从键盘接收一个值并将其赋予变量key)
3、用命令的结果赋值:通过反单引号把某个命令的输出赋予变量。
如:name=`pwd`
4、用位置变量赋值:把命令行上的某一参数的值赋予变量。
如:name=$2 (把第二个位置参数的值赋予变量name)
五、 执行命令
在Shell中执行一个命令有五种方法,具体如下叙述:
1、直接执行命令
在程序中通过调用命令名直接运行系统命令,如:lf 这种方式和在命令
中直接下命令的效果一样,也是最常用的执行方式。
2、使用sh命令
在程序中通过sh command的形式运行其它Shell程序。这种方式除了这
个程序可不具有执行权限外和直接执行命令的形式一样。
3、使用”.”命令
在程序中以 .command的形式运行命令(程序)。这时和使用sh命令相似,
只不过它不像sh一样会产生新的进程,相反,它会在原有的进程下完成。
4、使用exec命令
在程序中以exec command的形式运行命令(程序)。此时这个Shell程
序将会被所执行的命令所取代。当这个命令执行完毕之后,这个Shell程序
也会随之结束。