1.条件测试与捕获信号
在Shell脚本中,一般使用条件测试作为依据。
条件测试的内容包括:
- 用户的输入
- 某条命令执行完之后返回的状态
- 变量值
- 文件状态
- 系统发送的信号
在Linux系统中,无论是命令、脚本还是程序执行完成后都存在退出状态,退出状态通常保存在预定义变量$?中。0表示成功,1表示失败(退出状态可以自定义,默认非0为失败)
在脚本中设置退出状态用exit(无论脚本执行到何处,遇到exit立即设置退出状态,然后退出脚本)
- exit 0:表示返回脚本执行成功,没有错误返回
- exit 1:表示执行失败,有错误返回
2.文件测试
- 文件基本测试:文件、目录是否存在、文件类型、文件长度等
- 文件权限测试:读取、写入、执行等
文件基本测试大多时候用在创建文件、目录之前,使得脚本容错性更高
文件基本测试常用命令和含义:
命令 | 含义 |
---|---|
d | 测试目标是否存在,并且是一个目录 |
f | 测试目标文件是否存在,并且是一个普通文件 |
L | 测试目标是否存在,并且是一个链接文件 |
b | 测试文件是否存在,并且是一个块设备文件 |
c | 测试目标文件是否存在,并且是一个字符设备文件 |
e | 测试指定文件或目录是否存在 |
[-command parameter]
command为测试命令,parameter需要测试的目标文件和目录。
文件测试命令和测试参数都要放在中括号内
[ -d /etc/rc.local ] //测试rc.local是否为一个目录
文件权限测试命令和含义
命令 | 含义 |
---|---|
w | 判断指定的文件是否存在,并且拥有可写入权限 |
r | 判断指定的文件是否存在,并且拥有可读取权限 |
x | 判断指定的文件是否存在,并且拥有可执行权限 |
u | 判断指定的文件是否具有SUID权限 |
对文件权限进行测试的时候,这些测试都是针对脚本的执行用户,并非测试的是文件属主的权限
3.变量测试
测试变量是否被定义需要使用命令z,这个命令的格式与文件测试命令一样,需要注意的是,用z命令测试时,没有被定义的变量将返回数字0。已定义的变量将返回数字1
4.字符串和数值测试
字符串测试的查找符:
操作符 | 含义 |
---|---|
= | 判断两个字符串是否相等,如果相等返回0 |
!= | 判断两个字符串是否不相等,如果不相等返回0 |
n | 判断字符串是否为空 |
[ parameter1 operator parameter2 ]
[ -n "$NAME"] //测试字符串是否为空
数值测试:
操作符 | 含义 |
---|---|
eq | 如果两个数相等,返回真 |
ne | 如果两个数不相等,返回真 |
lt | 如果第1个数小于第2个数,返回真 |
le | 如果第1个数大于等于第2个数,返回真 |
gt | 如果第1个数大于第2个数,返回真 |
ge | 如果第1个数大于等于第2个数,返回真 |
判断两个属是否相等,也可使用字符串测试符号= != 进行测试
[ 300 -lt 200 ] // 300是否小于200
5.逻辑操作符
逻辑操作符和含义:
操作符 | 含义 |
---|---|
a | 逻辑与,一假必假 |
o | 逻辑或,一真必真 |
! | 逻辑非,真假互换 |
[ -r /etc/passwd -a -w /etc/passwd ] //逻辑与操作符判断/etc/passwd是否可读、写
6.捕获系统信号
可捕获的信号:
信号 | 含义 |
---|---|
1(SIGHUP) | 来自控制终端的刮起或来自控制进程的死亡信号 |
2(SIGINT) | 来自键盘的中断信号 |
3(SIGQUIT) | 来自键盘的推出信号 |
15(SIGTERM) | 终止信号 |
如果无法确定要捕获的信号,可在重要的脚本中捕获所有可以捕获的信号
捕获信号后可采取的措施:
- 不采取任何措施,由系统处理这些信号【这会导致脚本结束执行,暂停等】
- 捕获并忽略信号【捕获后不采取任何操作】
- 捕获信号并采取操作【通常操作是提示用户是否需要中断脚本的执行,也可以向用户发出脚本正在执行不能退出的消息】
trap "command" signals
command表示捕获到信号后需要执行的命令或函数,如果为空(”“)表示胡烈信号
signals表示要捕获的信号列表,可以使用数字表示,捕获多个信号使用空格