目录
一.函数的定义和作用
1.定义
2.作用
二.函数的定义、调用和返回值
1.定义函数
2.调用函数
3.return返回值
三.函数传参
四.shell实现mysqldump备份
1.编写shell脚本实现使用mysqldump进行分库分表备份
2.查看数据库原有数据
3.运行脚本文件进行备份数据,查看备份文件是否存在
4.删除原有数据
5.可以单独恢复某个表的数据,也可以直接恢复数据内所有的数据,恢复前先解压
类似于一个功能独立的代码集合,成为代码块,用户可以通过定义好函数并且在有需求时调用这一部分函数来实现部分功能
(1)将重复功能的代码段定义为函数,减少代码量,增强可读性、易读性、开发和管理效率
(2)实现程序功能模块化,是的代码程序可移植性更强
(1)通过function 函数名()加上{}进行定义
function 函数名()
{
命令
return
}
#!/bin/bash
function ninenine() {
echo "dingyi"
return
}
(2)同上,小括号可省略
#!/bin/bash
function ninenine {
echo "dingyi"
return
}
(3)通过函数名()加上{}进行定义,这里的小括号不能省略
函数名()
{
命令
}
#!/bin/bash
ninenine() {
echo "dingyi"
return
}
(1)本shell文件内直接指定函数名进行调用
#!/bin/bash
function ninenine {
echo "dingyianddiaoyong"
return
}
ninenine
[root@sulibao sh]# bash hanshu.sh dingyianddiaoyong |
(2)在其他脚本文件中调用文件外函数
注意:需要使用不产生子进程的方式来执行调用,bash产生子进程执行调用报错
#!/bin/bash
bash hanshu.sh
ninenine
[root@sulibao sh]# bash hanshudiaoyong.sh hanshudiaoyong.sh: line 3: ninenine: command not found |
#!/bin/bash
. hanshu.sh
#相对路径,位于当前目录下的shell文件,不在当前目录下需要指定绝对路径
ninenine
[root@sulibao sh]# bash hanshudiaoyong.sh dingyianddiaoyong |
用户在命令后添加return值,在调用函数时可以执行出return的值,return只能正确返回0-255之间的整数
#!/bin/bash
function ninenine {
echo "dingyianddiaoyong"
return 255
}
ninenine
echo $?
[root@sulibao sh]# bash hanshu.sh dingyianddiaoyong 255 |
#!/bin/bash
function ninenine {
echo "dingyianddiaoyong"
return 256
}
ninenine
echo $?
[root@sulibao sh]# bash hanshu.sh dingyianddiaoyong 0 |
通过$符配合数字来传输第几个参数,并在函数调用时紧接着提供参数,不能在执行脚本文件时提供参数(无法生效)
#!/bin/bash
function ninenine {
echo "dingyianddiaoyong"
echo $1
return 255
}
ninenine 666
echo $?
#!/bin/bash
mysqlup='-uroot -pSLBmysql@317418'
#定义数据库登录用户和密码变量
exdbname='information_schema|performance_schema|sys|mysql'
#定义排除数据库变量
bak_path=/backup/db
#定义备份路径变量
mysql $mysqlup -e 'show databases' 2>/dev/null -N | egrep -v $exdbname > dbname
#排除数据库
while read db
#对库进行操作
do
[ -d ${bak_path}/$db ] || mkdir -p ${bak_path}/$db
#验证是否存在备份路径,不存在则创建
mysqldump $mysqlup -B $db 2>/dev/null | gzip > ${bak_path}/${db}/${db}_$(date +%F).sql.gz
#备份库并压缩为指定格式
mysql $mysqlup -N -e "show tables from $db" 2>/dev/null > tbname
#列出库内的表
while read tb
#对表进行操作
do
mysqldump $mysqlup $db $tb 2>/dev/null | gzip > ${bak_path}/$db/$db_${tb}_$(date +%F).sql.gz
#备份该库内的表并压缩为指定格式
done < tbname
done < dbname
rm -rf dbname tbname
#删除当前目录下库名和表名暂存文件
mysql8.0 [SLB]>select * from worker;
+-----------+-----------+--------------+---------+--------------+--------+--------------+
| 部门号 | 职工号 | 工作时间 | 工资 | 政治面貌 | 姓名 | 出生日期 |
+-----------+-----------+--------------+---------+--------------+--------+--------------+
| 101 | 1001 | 2015-05-04 | 3500.00 | 群众 | 张三 | 1990-07-01 |
| 101 | 1002 | 2017-02-06 | 3200.00 | 团员 | 李四 | 1997-02-08 |
| 102 | 1003 | 2011-01-04 | 8500.00 | 党员 | 王亮 | 1983-06-08 |
| 102 | 1004 | 2016-10-10 | 5500.00 | 群众 | 赵六 | 1994-09-05 |
| 102 | 1005 | 2014-04-01 | 4800.00 | 党员 | 钱七 | 1992-12-30 |
| 102 | 1006 | 2017-05-05 | 4500.00 | 党员 | 孙八 | 1996-09-02 |
+-----------+-----------+--------------+---------+--------------+--------+--------------+
6 rows in set (0.00 sec)
[root@localhost shfile]# ll /backup/db/SLB/
total 8
-rw-r--r--. 1 root root 1113 Aug 6 14:58 SLB_2023-08-06.sql.gz
-rw-r--r--. 1 root root 1023 Aug 6 14:58 worker_2023-08-06.sql.gz
mysql8.0 [SLB]>drop table worker;
Query OK, 0 rows affected (0.01 sec)
mysql8.0 [SLB]>show tables;
Empty set (0.00 sec)
[root@localhost shfile]# gunzip /backup/db/SLB/worker_2023-08-06.sql.gz;cat /backup/db/SLB/worker_2023-08-06.sql | mysql -uroot -p SLB
Enter password:
mysql8.0 [SLB]>show tables;
+---------------+
| Tables_in_SLB |
+---------------+
| worker |
+---------------+
1 row in set (0.00 sec)
mysql8.0 [SLB]>select * from worker;
+-----------+-----------+--------------+---------+--------------+--------+--------------+
| 部门号 | 职工号 | 工作时间 | 工资 | 政治面貌 | 姓名 | 出生日期 |
+-----------+-----------+--------------+---------+--------------+--------+--------------+
| 101 | 1001 | 2015-05-04 | 3500.00 | 群众 | 张三 | 1990-07-01 |
| 101 | 1002 | 2017-02-06 | 3200.00 | 团员 | 李四 | 1997-02-08 |
| 102 | 1003 | 2011-01-04 | 8500.00 | 党员 | 王亮 | 1983-06-08 |
| 102 | 1004 | 2016-10-10 | 5500.00 | 群众 | 赵六 | 1994-09-05 |
| 102 | 1005 | 2014-04-01 | 4800.00 | 党员 | 钱七 | 1992-12-30 |
| 102 | 1006 | 2017-05-05 | 4500.00 | 党员 | 孙八 | 1996-09-02 |
+-----------+-----------+--------------+---------+--------------+--------+--------------+
6 rows in set (0.00 sec)
[root@localhost shfile]# gunzip /backup/db/SLB/SLB_2023-08-06.sql.gz;cat /backup/db/SLB/SLB_2023-08-06.sql | mysql -uroot -p SLB
Enter password:
mysql8.0 [SLB]>show tables;
+---------------+
| Tables_in_SLB |
+---------------+
| worker |
+---------------+
1 row in set (0.00 sec)
mysql8.0 [SLB]>select * from worker;
+-----------+-----------+--------------+---------+--------------+--------+--------------+
| 部门号 | 职工号 | 工作时间 | 工资 | 政治面貌 | 姓名 | 出生日期 |
+-----------+-----------+--------------+---------+--------------+--------+--------------+
| 101 | 1001 | 2015-05-04 | 3500.00 | 群众 | 张三 | 1990-07-01 |
| 101 | 1002 | 2017-02-06 | 3200.00 | 团员 | 李四 | 1997-02-08 |
| 102 | 1003 | 2011-01-04 | 8500.00 | 党员 | 王亮 | 1983-06-08 |
| 102 | 1004 | 2016-10-10 | 5500.00 | 群众 | 赵六 | 1994-09-05 |
| 102 | 1005 | 2014-04-01 | 4800.00 | 党员 | 钱七 | 1992-12-30 |
| 102 | 1006 | 2017-05-05 | 4500.00 | 党员 | 孙八 | 1996-09-02 |
+-----------+-----------+--------------+---------+--------------+--------+--------------+
6 rows in set (0.00 sec)