接着之前的内容继续讲shell编程的基础。
这部分还是先要巩固重定向的使用,以及创建自己的文件描述符,在编写shell脚本中关注临时重定向和永久重定向的用法。
(1)< <<
(2)> >>
为了区分如上的重定向符号,大家搞懂以下2个例子就行:
cat > file <
&> 表示stdout和stderr都重定向
对于文件描述符,我们不光要掌握0,1,2,还要能够自己创建自己的文件描述符,且在shell编程中与默认的标准文件描述符进行组合使用。比如说要恢复文件描述符就是一个例子。
exec 3 >&1
exec 1> testfile
...
...
exec 1>&3
...
...
以上是输出重定向的恢复,输入重定向如下
exec 6 <&0
exec 0
exec 0 <&6
关闭文件描述符
exec 3 >&-
还有一种<>读写文件描述符的,慎用,最好是读完后再重定向写入,不然shell维护的内部指针会把文件内容搞得很混乱。
创建临时文件和目录
mktemp file.XXXXXX
mktemp -t 创建在/tmp下面且返回绝对路径
mktemp -d创建目录
tee的使用
tee -a
专注于为中小企业提供网站建设、成都网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业大石桥免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上1000+企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
重定向讲完,再讲讲脚本的控制。脚本的控制主要是信号的处理。
用kill -l就可以看到linux支持的信号。这些信号是一类“软中断信号”,信号分为硬中断信号和软中断信号,在中断处理的上半部分由硬中断执行,下半部分一般都是交给软中断执行。linux中的kill方式就是用户态下进程间异步信号通信的一种方法。按照不同的角度,还可以把信号分为实时和非实时,可靠和非可靠。
大部分信号都是会去停止,终止进程,但是还是有细微差异,比如信号是否可以捕获,是否可以忽略等等,信号的默认动作也是不一样的,有些会触发dump core。
基本掌握 ctrl+c ctrl+z 对应的信号
捕获信号使用trap “:” SIGINT
放弃捕获 trap --SIGINT
可以使用trap实现简单的跳板机程序
脚本还可以在后台执行 bash xx.sh &
如果希望终端退出不影响脚本的执行使用nohup
执行脚本就会产生进程,进程是需要占用内存和cpu资源的。一般通过nice renice来调整谦让度-20~19,值越低cpu需求越高。也可以用cpulimit和cgroup来实现进程的资源管理。cgroup可以对一组进程进行管理限制,且不限于cpu,memory,blkio也行。
定时脚本也是脚本控制的一个内容,at命令可以完成简单的需求。更多的还是使用crontab文件或者crontab命令来实现,anacron也需要了解一下。
函数是基础语法的最后一部分。
结构:
function xxx()
{
}
xxx()
{
}
在shell中变量默认都是全局的,如果要局部使用请加local
数组类等复杂变量无法直接传递,可以拆分后再组合来实现效果。
注意函数位置变量和脚本位置变量的关系,别混淆。
shell函数也能实现递归等操作。
shell定义函数也有单行的表示方式。
shell编写脚本后,可以把一些公共的标准函数放到一个shell文件中,后续在别的脚本中直接以库的形式引用,source和点操作符.来实现。