基础知识与原理
1. Linux下的Shell概述
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 | 垂直制表符 |
\ \ | \ |
\0??? | 八进制表示 |
\ ’ | ’ |
\ " | " |
3. Shell脚本的运行过程
Shell脚本文件的第一行通常会放置一行特殊的字符串,告诉操作系统使用哪个Shell来执行这个文件。
如果脚本的前两个字符是“#!”,那么系统会将这两个字符后面的那些字符作为执行该脚本的命令解释器的绝对路径名,该路径可以指定到任何程序的路径名,而不仅仅局限于Shell。如一个Shell脚本程序内容如下:
#!/bin/bash
# filename:bashscript //指定Shel1脚本名称
echo "这是第一个Shel1程序”
执行这个Shell脚本可以有三种方法:
(1)通过chmod命令把文件的权限设置成可读、可执行,然后直接执行该可执行文件,如下所示。
[root@localhost~]# chmod u+x 脚本文件名
[root@localhost~]# ./脚本文件名及其参数
例如:
//赋予文件bashscript可执行权限
[root@localhost~]# chmod u+x bashscript
[root@localhost~]# ./bashscript
这是第一个shell程序
(2)直接使用Shell的启动方式来执行脚本,如下所示。
//也可以使用tcsh、sh
[root@localhost~]# bash 脚本文件名及其参数
[root@localhost~]# tcsh bashscript
这是第一个shell程序
(3)使用bash内部命令“source”或“.”运行Shell 脚本,如下所示。
[root@localhost~]# source 脚本文件名及其参数
// ”.”和后面的程序名之间要留有空格
[root@localhost~]#. 脚本文件名及其参数