6.7 信号处理和临时文件清理

trap -l可以获得可以发送给进程得型号列表
SIGHUP:信号值1,进程挂起时
SIGINT:信号值2,用户发送中断信号ctrl+c时
SIGOUT:信号值3,用户发送退出信号ctrl+d时
SIGFPE:信号值8,试图进行非法数学操作时
......

信号捕获语法:trap command signal
command可以是任何有效得unix命令甚至一个用户定义得函数。

在脚本中创建临时文件并散布在系统中是不好的。通过信号捕获可以清理脚本创建的临时文件
e.g.
#!/bin/bash
tmp=/tmp/sigtrap$$ #使用shell进程ID创建临时文件
cat >$tmp #等待用户输入,空出测试的时间
function rmtmp()
{
if [ -f "$tmp" ]
then
echo "sorting out the tmp file"
rm -f "$tmp"
fi
}
trap rmtmp 1 2
exit 0

6.8 数组

6.8.1 声明
e.g.
array[index]=value
array2=(value1 value2 value3)
array3=([0]=value1 [10]=value2 [3]=value3)

6.8.2 获取数据
e.g. $(array[index])
取得数组所有数据:$(array[@])
取得数组元素数目:$(#array[@])
取得数组某索引开始余下元素:$(array[@]:index)
取得数组某索引开始余下的几个元素:$(array[@]:index:length)

6.8.3 删除数组数据
unset array[index]
unset array[@] 丢弃数组所有数据

6.8.4 使用文本中的数据
e.g. pop=("cat ~/tmp/txt | tr '\n' ' '")
解释:tr '\n' ' '把换行替换为空格,其格式返回的字符串以空格间隔,用来声明数组。
如果文件只有一行文本,则不用管道将文件内容发送给tr命令

6.9 受限shell
顾名思义,该shell是收到限制的。其特点有
1)不能使用cd切换目录
2)不能设置某些环境变量
3)不能实现IO重定向>,<...
4)不能使用exec来取代进程
5)不能使用包含斜线的命令
6)不能退出受限模式
运行受限模式通过-r启动
e.g.1
#!/bin/bash -r
cd ...
set +r
exit 0
e.g.2
cd /ok/...
set -r
cd
echo "..."
set +r
exit 0

6.10 系统管理
一名系统管理员,在许多工作中,有一些是不变的,包括从系统中获取信息,协调系统对资源的调用,安装软件等等。
注:使用cron可以实现特定时刻运行程序。方法不述。

6.10.1 收集信息
df:提供指定文件所在的文件系统信息,或者系统上已经安装的文件系统信息
du:给出文件系统块用法
lastlog:访问日志信息,打印出上次登陆的详细内容,可以指定用户
lsdev:检查/proc目录下安装的硬件信息,获得系统运行的硬件概况
lsof:显示当前打开文件的列表
ps:提供关于进程的信息
stat:提供关于文件和目录更详细的信息
top:提供一组占用CPU最多的进程
vmstat:提供系统上关于虚拟内存的信息
w:显示所有用户信息,包括进程信息

6.10.2 执行任务
chown:改变文件所有者
chgrp:改变文件从属组
mke2fs:创建新的ext2文件系统
dump:以二进制格式备份文件
mkswap:创建一个交换分区。该分区必须用swapon激活
mount,umount:安装或者反安装文件系统
ulimit:设置进程可以消耗的资源限制
useradd,userdel....:不说了
wall:相所有登陆的终端内些姓习
watch:以特定时间间隔反复执行命令

6.11 调试

1.sh是命令解释器,通过-n来使用不会执行脚本,只是简单读每一条命令。-v和-n组合可以得到更详细的输出
2.在脚本中添加set -x........set +x。在这一段内脚本将得到带+的输出。输出包括执行的命令和执行结果。
当然shell的脚本调试不如高级语言IDE来得方便。