「Linux 奏章 18」Shell 脚本

270 阅读3分钟

「这是我参与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 执行权限,可直接执行)

img

2. Shell 变量

Linux Shell 变量分类

  • 系统变量 : $HOME$PWD$SHELL$USER 等等
    img
  • 用户自定义变量<变量>=<值>

显示当前 shell 中所有的变量 : set

Shell 变量的定义

  • 定义变量 : 变量=值
  • 撤销变量 : unset 变量
  • 声明静态变量(无法 unset): readonly 变量

img

img

3. 设置环境变量

/etc/profile 文件中定义 TOMCAT_HOME 环境变量,因为该文件与环境变量相关!

基本语法

  • export 变量名=变量值 : 将 shell 变量输出为环境变量
  • source 配置文件 : 让修改后的配置信息立即生效
  • echo $变量名 : 查询环境变量的值

img

img

4. Shell 注释

 :<<!
 内容
 !

img

5. 位置参数变量(形参&实参)

当我们执行一个 shell 脚本时,想要获取到命令行的参数信息,就可以使用位置参数信息

执行 ./myshell.sh 100 200 ,可以用如下语法获得 100、200:

  • $n : n为数字,$0 表示命令本身,$1 ~ $9 代表实参1~实参9,其他参数位置需要带上 { },如 ${10}
  • $* : 表示命令行中的所有参数,区别于 $@
  • $@ : 也表示命令行中的所有参数
  • $# : 代表命令行中所有参数的个数

img

img

6. 预定义变量

shell 开发者预先定义好的变量,可以直接在 shell 脚本中使用。

  • $$ : 当前进程的进程号 PID
  • $! : 后台运行的最后一个进程的进程号 PID
  • $? : 最后一次执行的命令的返回状态,如果这个变量值为 0,证明上一个命令正确,反之不正确。

img

img

7. 运算符

  • 3 种运算式:

    • $((运算式))
    • $[运算式]
    • expr m + n (要用 `` 反引号将 expr m + n 引起来)
  • 注意 expr 运算符之间要有空格 expr m - nexpr m \* n

  • expr专属运算符: \* / % 分别表示乘、除、取余

img

img

8. 条件判断

  • ⭐基本语法 :
 # 注意condition前后都要有空格,非空返回true,可用 $? 验证(0为true、非0为false
 [ condition ]
 
 # 条件满足,则执行后面的语句
 [ condition ] && echo OK || echo notok
  • ⭐判断语句:

    • 字符串判断
      • =
    • 整数比较
      • -lt
      • le
      • eq
      • gt
      • ge
      • ne
    • 按照文件权限进行判断
      • -r : 读的权限
      • -w : 写的权限
      • -x : 执行的权限
    • 按照文件类型进行判断
      • -f : 文件存在且是一个常规的文件
      • -e : 文件/目录 存在
      • -d : 文件存在并是一个目录
  • ⭐应用实例:

img

img

9. 流程控制

9.1 if 判断

 if [ condition ]
 then
     代码
 elif [ condition ]
 then
     代码
 fi

9.2 case 语句

 case $变量名 in
 "值1")
 代码1
 ;;
 "值2")
 代码2
 ;;
 *)
 最后的代码
 ;;
 esac

img

img

9.3 for 循环

 # 基本语法1
 for 变量 in 值1 值2 值3
 do
     代码
 done
 
 # 基本语法2(可直接使用<=、>..)
 for(( 初始值;循环控制条件;变量变化 ))
 do
     代码
 done

img

img

9.4 while 循环

 # condition 即 条件判断中的 -lt、-ge、-f 等等
 while [ condition ]
 do
     程序
 done

img

img

10. read 获取控制台输入

#!/bin/bash
read (选项) (参数) <接收控制台输入的参数>
  • 选项
    • -p: 指定读取值时的提示信息
    • -t: 指定读取值时等待的时间(秒),如果没有在指定时间内输入,则不再等待..

img

img

11. 自定义函数

基本语法

这里的 []: 代表可选

 [ function ] funName[()]
 {
     Action;
     [return int;]
 }
 
 #调用:
 funName [值]

案例1:计算输入两个参数的和(动态获取)

img

img

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 备份指令

希望本文对你有所帮助🧠
欢迎在评论区留下你的看法🌊,我们一起讨论与分享🔥