Linux篇:shell中while read line的用法及实战

作者 : 开心源码 本文共2069个字,预计阅读时间需要6分钟 发布时间: 2022-05-13 共220人阅读

01 前言

在shell脚本中,我们经常看到以下的一种结构:

while read line

do

???????…

done < file

可能不熟习shell的人看到这个会有点懵,其实这是shell中while read line的一种用法:

read通过输入重定向,把file的第一行所有的内容赋值给变量line,循环体内的命令一般包含对变量line的解决;而后循环解决file的第二行、第三行。。。一直到file的最后一行。

还记得while根据其后的命令退出状态来判断能否执行循环体吗?

是的,read命令也有退出状态,当它从文件file中读到内容时,退出状态为0,循环继续进行;

当read从文件中读完最后一行后,下次便没有内容可读了,此时read的退出状态为非0,所以循环才会退出。

02 while read line 与for 循环的区别

看完上面的定义,可能很多同学会说这是不是和for循环一样,这我们作一下说明:

while read line 是一次性将文件信息读入并按行赋值给变量line ,while中使用重定向机制,文件中的所有信息都被读入并重定向给了整个while 语句中的line 变量。

for是每次读取文件中一个以空格为分割符的字符串。

03 实战?

题目:利用while read line 实现MySQL的分库备份,备份频次为每天,要求备份数据存储在每一个以数据库名的文件夹中


第一步:获取需备份的数据库名

# 使用mysql命令行获取数据库名,存储到mysql.name文件中

mysql? -uroot? -proot? -e “show databases” | sed 1,2d >mysql.name

第二步:建立while read line 结构

while? read? line

do

done < mysql.name

第三步:定义时间戳变量及备份路径输出记录日志

time1=` date? +%Y%m%d`

time2= ` date? ?+%Y-%m-%d%t%H:%M:%S `

mysql? -uroot? -proot? -e “show databases” | sed 1,2d >mysql.name

while? read? line?

do

dir=/data/mysql/${line}/

log=/data/mysql/${line}/${line}-${time1}.out

[? -d? $dir? ]? &&? echo ” “>/dev/null 2>&1? ||? mkdir? -p? $dir

[? -f? $log? ]? &&???echo ” “>/dev/null 2>&1? ||? touch? $log

done < mysql.name

第四步:while循环中加入备份命令

time1=` date? +%Y%m%d `

time2= ` date? ?+%Y-%m-%d%t%H:%M:%S `

mysql? -uroot? -proot? -e “show databases” | sed 1,2d >mysql.name

while? read? line?

do

dir=/data/mysql/${line}/

log=/data/mysql/${line}/${line}-${time1}.out

[? -d? $dir? ]? &&? echo ” “>/dev/null 2>&1? ||? mkdir? -p? $dir

[? -f? $log? ]? &&???echo ” “>/dev/null 2>&1? ||? touch? $log

mysqldump? -uroot? -proot? -B ${line} > ${dir}/${line}-${time1}.sql

done < mysql.name

第五步:完善日志记录部分及脚本安一律分,完整脚本如下

set? -u

set? -e

time1=` date? +%Y%m%d`

time2= ` date? ?+%Y-%m-%d%t%H:%M:%S `

mysql? -uroot? -proot? -e “show databases” | sed 1,2d >mysql.name

while? read? line?

do

dir=/data/mysql/${line}/

log=/data/mysql/${line}/${line}-${time1}.out

[? -d? $dir? ]? &&? echo ” “>/dev/null 2>&1? ||? mkdir? -p? $dir

[? -f? $log? ]? &&???echo ” “>/dev/null 2>&1? ||? touch? $log

echo? ${time1}>>${log}

mysqldump? -uroot? -proot? -B ${line} > ${dir}/${line}-${time1}.sql

if? [? S?? -eq? 0? ];then

? ? ?echo? “【${time2}】,数据库名:${line},备份成功!”>>${log}

else

? ? ?echo? “【${time2}】,数据库名:${line},备份失败!”>>${log}

fi

done < mysql.name

第六步:加入定时任务

00? 03? *? *? *? sh? ?/home/gzcb/shell/mysql_backup.sh

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Linux篇:shell中while read line的用法及实战

发表回复