「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」。
1. Shell 脚本编程的快速入门
1.1 为什么要学习 Shell❓
- Linux 运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理
- 对于 JavaEE 和 Python 程序员来说,工作的需要:上司可能要求你编写一些 shell 脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本 (文末介绍)!
- 对于大数据程序员来说,需要编写 shell 程序来管理集群。
1.2 Shell 是什么
Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便于程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。
⭐Shell 脚本的执行方式:
- 🔥 脚本要以
#!/bin/bash开头 - 🔥 脚本需要拥有可执行权限
chmod u+x ...
⭐Shell 脚本常用执行方式
- 方式一:输入脚本的绝对路径或相对路径
- 方式二:
sh <脚本>(无需 x 执行权限,可直接执行)
2. Shell 变量
Linux Shell 变量分类
- 系统变量 :
$HOME、$PWD、$SHELL、$USER等等
- 用户自定义变量:
<变量>=<值>
显示当前 shell 中所有的变量 : set
Shell 变量的定义
- 定义变量 :
变量=值 - 撤销变量 :
unset 变量 - 声明静态变量(无法
unset):readonly 变量
3. 设置环境变量
⭐在 /etc/profile 文件中定义 TOMCAT_HOME 环境变量,因为该文件与环境变量相关!
基本语法:
export 变量名=变量值: 将 shell 变量输出为环境变量source 配置文件: 让修改后的配置信息立即生效echo $变量名: 查询环境变量的值
4. Shell 注释
:<<!
内容
!
5. 位置参数变量(形参&实参)
当我们执行一个 shell 脚本时,想要获取到命令行的参数信息,就可以使用位置参数信息
执行 ./myshell.sh 100 200 ,可以用如下语法获得 100、200:
$n: n为数字,$0表示命令本身,$1~$9代表实参1~实参9,其他参数位置需要带上{ },如${10}。$*: 表示命令行中的所有参数,区别于$@$@: 也表示命令行中的所有参数$#: 代表命令行中所有参数的个数
6. 预定义变量
shell 开发者预先定义好的变量,可以直接在 shell 脚本中使用。
$$: 当前进程的进程号 PID$!: 后台运行的最后一个进程的进程号 PID$?: 最后一次执行的命令的返回状态,如果这个变量值为 0,证明上一个命令正确,反之不正确。
7. 运算符
-
3 种运算式:
- ①
$((运算式)) - ②
$[运算式] - ③
expr m + n(要用 `` 反引号将 expr m + n 引起来)
- ①
-
注意 expr 运算符之间要有空格
expr m - n、expr m \* n -
expr专属运算符:\* / %分别表示乘、除、取余
8. 条件判断
- ⭐基本语法 :
# 注意condition前后都要有空格,非空返回true,可用 $? 验证(0为true、非0为false)
[ condition ]
# 条件满足,则执行后面的语句
[ condition ] && echo OK || echo notok
-
⭐判断语句:
- 字符串判断
=
- 整数比较
-ltleeqgtgene
- 按照文件权限进行判断
-r: 读的权限-w: 写的权限-x: 执行的权限
- 按照文件类型进行判断
-f: 文件存在且是一个常规的文件-e: 文件/目录 存在-d: 文件存在并是一个目录
- 字符串判断
-
⭐应用实例:
9. 流程控制
9.1 if 判断
if [ condition ]
then
代码
elif [ condition ]
then
代码
fi
9.2 case 语句
case $变量名 in
"值1")
代码1
;;
"值2")
代码2
;;
*)
最后的代码
;;
esac
9.3 for 循环
# 基本语法1
for 变量 in 值1 值2 值3
do
代码
done
# 基本语法2(可直接使用<=、>..)
for(( 初始值;循环控制条件;变量变化 ))
do
代码
done
9.4 while 循环
# condition 即 条件判断中的 -lt、-ge、-f 等等
while [ condition ]
do
程序
done
10. read 获取控制台输入
#!/bin/bash
read (选项) (参数) <接收控制台输入的参数>
- 选项
-p: 指定读取值时的提示信息-t: 指定读取值时等待的时间(秒),如果没有在指定时间内输入,则不再等待..
11. 自定义函数
基本语法
这里的 []: 代表可选
[ function ] funName[()]
{
Action;
[return int;]
}
#调用:
funName [值]
案例1:计算输入两个参数的和(动态获取)
12. 定时备份数据库⭐
需求分析:
- 每天凌晨 2:30 备份数据库 test 到
/data/backup/db - 备份开始和备份结束能够给出相应的提示信息
- 备份后的文件要求以备份时间为文件名,并打包成
.tar.gz形式,比如:2021-07-16_23:02:01.tar.gz - 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除(以防 linux 磁盘用完)
⭐定时备份数据库:
1、cd /usr/sbin/ : root 用户可直接执行的命令
2、vim mysql_db_backup.sh : 开始编写 shell 脚本
#!/bin/bash
# 备份目录
BACKUP=/data/backup/db
# 当前时间
DATETIME=$(date +%Y-%m-%d_%H:%M:%S)
# 数据库地址
HOST=localhost
# 数据库用户名
DB_USER=root
# 数据库密码
DB_PW=root
# 备份的数据库名
DATABASE=test
# 创建备份目录(如果不存在就创建)
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
# 备份数据库
mysqldump -u${DB_USER} -p${DB_PW} --host=${HOST} -q -R --datebase ${DATABASE} | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
# 将文件处理成 .tar.gz
cd ${BACKUP}
tar -zcvf $DATETIME.tar.gz ${DATETIME}
# 删除对应的备份目录
rm -rf ${BACKUP}/${DATETIME}
# 删除10天前的备份文件
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "成功备份数据库${DATABASE}~"
3、crontab -e:编辑定时任务调度列表
30 2 * * * /usr/sbin/mysql_db_backup.sh
4、crontab -l
5、chmod u+x mysql_db_backup.sh : 给予用户调度的权限
[root@localhost sbin]# chmod u+x mysql_db_backup.sh
6、yum install mysqldump:记得安装 mysql 备份指令
希望本文对你有所帮助🧠
欢迎在评论区留下你的看法🌊,我们一起讨论与分享🔥