本脚本现实中使用的意义在于可以根据配置文件来定时打包文件,然后再配合cron定时执行脚本以及定时删除过期文件,可以达到按时备份数据的功能。
本脚本根据shell脚本编程大全修改,最终托管在shells/Hourly_Archive.sh at main · laufei90/shells (github.com) 。请上github上查看,在此就不贴代码了。
整个脚本分为部分。
一、判断配置文件是否存在,不存在则推出;
二、循环读取配置文件,如果配置文件中文件存在则添加到FILE_LIST ;
读取配置文件里面的条目数据有三种方法。笔者使用第二种方法。
1、cat命令输出到for循环,比如:
for hostname in `cat /home/lighthouse/shell/HOSTid`
2、exec重定向标准输入STDIN,比如从基本脚本中提取的一部分代码。
exec < $CONFIG_FILE
read FILE_NAME
while [ $? -eq 0 ]
3、cat命令通过管道符传递到while循环。
cat filename | while read line
第3个示例中 cat filename | while read line,因为管道会开启子shell,使得while中的命令都在子shell中执行,数据会丢失。而且第一和第三的cat 会一次性将文件所有数据装入内存,如果文件足够大,会直接占用巨量内存。而第二个示例使用输入重定向的方式则每次只占用一行数据的内存,而且是在当前shell环境下执行的,while内的变量赋值、数组赋值在退出while后仍然有效。
三、tar -czf打包压缩FILE_LIST文件 。
在测试时,笔者遇到的一个问题就是再配置文件中写了注释信息, read 命令将读取注释信息作为文件名来判断是否存在,这个是不合理的。使用cat命令读取配置文件时,可以使用管道符|传递给grep或者 sed来处理。
sed '/^#/d' 或者 grep -v ^# 。
但是使用重定向标准输入的时候,笔者没有找到read指令跳过#开头的哪一行,可能只能通过循环内部if来判断了。或者注意在配置文件内部不能直接写注释信息。
测试结果如下:

网友评论