Shell的概念最初是在UNIX操作系统中形成和得到广泛应用的,Linux系统继承了UNIX系统中Shell的全部功能。Shell是Linux的一个外壳,它包在Linux内核的外面,为用户和内核之间的交换提供一个接口。
用户通过终端使用系统,从键盘输入指令和数据,从屏幕得到信息及响应。用户通过终端输入的所有信息都会先传给Shell处理,Shell再把处理过的信息传给内核或程序执行。而系统的响应,也循着相反的方向由Shell传到屏幕上显示给用户。所以当下达指令给操作系统时,其实是把指令告诉Shell,经过Shell解释、处理后才让内核运行。
Shell具有以下特点,
(I)把已有命令进行适当组合构成新的命令。
(2)提供了文件名扩展字符(通配符,如“ * ”、“ ?”、“ [ ] ”),使用单一的字符串可以匹配多个文件名。
(3)可以直接使用Shell的内置命令,而不需要创建新的进程,如提供的cd、echo、exit、pwd和kill等命令。
(4)Shell允许灵活地使用数据流、提供通配符、输入/输出以及管道等机制,方便模式匹配、I/O处理和数据传输。
(5)结构化程序模式,提供了顺序流程控制、条件控制以及循环控制等。
(6)Shell提供了可配置的环境,允许创建和修改命令、命令提示器和其他的系统行为。
(7)Shel提供了一种高级的命令语言,能够创建从简单到复杂的程序。
2. Shell使用的符号除使用普通键盘可以输入的字符外,Shel中还可以使用一些具有特殊含义和功能的特殊字符,使用它们时,应注意其特殊的含义和作用范围。
2.1 空白格在UNIX/Linux系统中,空格和Tab成为空白格。
2.2.通配符通配符用于模式匹配,如文件名匹配、路径名搜索、字符串查找等。用户可以在作为命令参数的文件名中包括这些通配符,构成一个所谓的“模式串”,在执行过程中进行模式匹配。
(1)“ * ”通配符:代表从它所在位置开始的任何字符串,如“ f*”匹配以f打头的任意字符串。文件名前的圆点“.”和路径名中的斜线“/”必须显示匹配,如“ * ”不能匹配.file,而“.* ”可以匹配.file。
(2)“ ?”通配符:代表它所在位置上的任何单个字符。
(3)[ ]:代表一个指定范围的字符,只要文件名中“[ ]”位置处的字符在“[ ]”中指定的范围内,那么这个文件名在此处可以被匹配。方括号中的字符范围可以由直接给出的字符组成,也可以由表示限定范围的起始字符、终止字符及中间的连接字符“组成”。例如f[a-b]与f[abcd]的作用相同。[ ]内的第一个字符若是“ ^ ”或“ ! ”,则为非运算,意为不匹配[ ]内的字符,如f [!a-b]或f[^ a-b]表示不匹配方括号内的a-b的字符集,或匹配[ ]之外的字符集。下面是通配符表
| 通配符 | 含义 |
|---|---|
| * | 匹配所有,但不包括以.开头的文件,如包括abc,但不包括.abc |
| * Text * | 匹配所有文件名中包括Text的文件名,但不包括以.开头的文件 |
| [ab-dm]* | 匹配当前目录下所有以a、b、c、d、m开头的文件名 |
| [ab-dm]? | 匹配所有以a、b、c、d、m开头且后面只跟有一个字符的文件名 |
| [! ab-dm]?或[^ab-dm]? | 匹配所有不以a、b、c、d、m开头且后面只跟有一个字符的文件名 |
| /dev/hd? | 匹配目录/dev下所有以hd开头且只有三个字符的文件名 |
连字符“-”仅在方括号内且在中间时有效,表示字符范围,若在方括号外面或在方括号内最前或最后就成为普通字符,字符“^”和“!”只有在方括号内且位于开始位置才起“非”的作用,而“ * ”和“ ? ”只在方括号外面是通配符,若出现在方括号之内,它们也失去通配符的能力,成为普通字符。
2.3 注释符与注释在Shell编程中,经常对某些正文进行注释,以增加程序的可读性,规定以“#”开头的行是注释行。
2.4 转义宇符UNIX/Linux系统中还有一个特殊的字符“”,用于对某些特殊字符的表示。如下表
| 特殊字符 | 意义 |
|---|---|
| a | 响铃符 |
| b | 退格符 |
| f | 换页 |
| n | 换行 |
| ×?? | 十六进制 |
| t | 水平制表符 |
| v | 垂直制表符 |


