【Linux开发 第十三篇】shell编程

发布于:2024-04-24 ⋅ 阅读:(18) ⋅ 点赞:(0)

shell编程

对于后端开发,掌握shell编程是非常有必要的,可以对服务器进行维护,同时也可以对数据库进行操作

shell是一个命令解释器,它为用户提供了一个向Linux内核发送请求来运行的界面级程序,用户可以通过shell来启动,挂起,停止,编写一些程序

shell脚本

脚本必须以#!/bin/bash开头
脚本要运行必须需要可执行性权限

  • shell变量

Linux系统shell的变量分为,系统变量和用户自定义变量
系统变量:$HOME,$PWD,$SHELL,$USER
set:显示系统中的变量

如何在shell中定义变量:
定义变量:变量名=值
撤销变量:unset 变量
声明静态变量:readonly变量
注意:静态变量不能够通过unset撤销
变量名称可以由字母,数字和下划线组成,但是不能一数字开头
等号两边不能有空格

A=date:是将单词date赋予A,而如果date上加上反引号就是将date命令运行的结果赋予给A
A=$(date):将date命令执行完成后的结果赋予给A

  • 如何设置环境变量

export 变量名=变量值:将shell变量输出为环境变量(全局变量)
source 配置文件:让修改后的配置文件立即生效
echo $变量名:查询环境变量的值
/etc/profile:系统环境变量的配置文件

  • shell脚本的多行注释

:<<! 内容 !:用来注释多行内容

  • 位置参数

命令行输入的参数通过位置参数来进行操作
$n:n为数字,$0代表命令本身,$1-$9代表第一个到第九个参数

${10}:十以上的参数通过大括号{}来进行标定
$*:这个变量表示命令行中所有的参数,将所有的参数看成一个整体
$@:同样表示命令行所有的参数,不过把每个参数区分对待
$#: 表示命令行中所有参数的个数

  • 预定义变量

$$:当前进程的进程号
$!:后台运行的最后一个进程的进程号
$?:最后一次执行的命令的返回值,返回0表示执行正确,反之执行错误

  • 运算符

进行运算:$((运算式))$[运算式]expr m + n
注意:expr运算符之间又有空格,将expr预算结果进行赋值时需要加上反引号
在expr中加减乘除,取余都可以进行操作
注意:在expr中乘号*需要用\*来替代

  • 条件判断

[condition](注意condition前后不要有空格)
非空返回true,可使用$?验证
字符判断条件:
=:字符串比较
整数之间的比较:

符号 意义
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于

按照文件执行权限比较:

符号 意义
-r 有读的权限
-w 有写的权限
-x 有执行的权限

按照文件类型进行判断:

符号 意义
-f 文件存在并且是一个常规文件
-e 文件存在
-d 文件存在并是一个目录

实例if语句:

if [ "ok"="ok" ]   //if表示语句开始
  then 	
     echo "s"
fi  //fi表示判断语句的结束
if [ 2 -ge 1 ]
   then 
      echo "大于"
fi

条件分支语句:

if [ 74 -ge 60 ]
  then 
     echo "及格"
elif [ 74 -lt 60 ]
  then 
     echo "不及格"
fi
  • case语句

case $变量名 in
"值1"):如果变量值等于值1,则执行程序1
;;
"值2"):如果变量值等于值2,则执行程序2
;;
esac
在这里插入图片描述

  • for循环

for 变量 in 值
do
程序代码
done

在for循环中如果使用$*:将以整体的形式一次性输出
$@:将是以分个的形式一个一个输出

SUM=0
for((i=1;i<=100;i++))
do
  SUM=$[$SUM+$i]
done
  • while循环

while [条件判断式]
do
程序
done

案例:从命令行输入一个数n,统计1加到n的值

SUM=0
i=0
while [ $i -le $1 ]
do 
     SUM=$[$SUM+$i]
     i=$[$i+1]
done
echo "执行结果=$SUM"
  • read读取控制台输入

read (选项) (参数)
选项:
-p: 指定读取值时的提示符
-t: 指定读取值时等待的时间(秒),如果没有在指定的时间内输入退出

read -p "请输入一个数" A
echo "输入的数为$A"

在规定时间内输入一个数

read -t 10 -p "请输入一个数" A
echo "你输入的数为$A"

函数

shell编程中的函数分为系统函数和自定义函数

  • 系统函数

basename [pathname] [suffix]:basename命令会删掉所有的前缀包括最后一个’/'字符,然后将字符串返回回来,同时也会将suffix后缀也删掉

basename /home/hont/test.txt .txt
输出下来就是test

dirname 文件绝对路径:从给定的包含绝对路径的文件名中去除文件名,然后返回目录部分

dirname /home/nihao/test.txt
输出为dirname/home/nihao 
  • 自定义函数

基本语法:

[function] funname[()]
{
    Action;
    [return int;]
}

调用的时候直接: funname [值]

n1=1;
n2=2;
function sum(){
   sum=$[$n1+$n2]
   echo "和是$sum"
}

sum $n1 $n2

数据库备份

完成一个数据库的备份,要求:

  1. 每天凌晨2:30备份数据库到 data/backup/db中
  2. 备份开始和备份结束给出相应的提示信息
  3. 备份之后要求以备份时间为文件名,并打包
  4. 在备份的同时,检查是否有10天前备份的数据库文件,如果有将其删除

编写备份数据库的shell脚本:

#!/bin/bash

# 备份目录
BACKUP=/data/backup/db
# 当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
# 数据库的地址
HOST=localhost
# 数据库的用户名
DB_USER=root
# 数据库的密码
DB_PW=hlh520521
# 备份的数据库名
DATABASE=aaa

# 创建备份目录
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
# 备份数据库
mysqldump -u${DB_USER} -p${DB_PW} -P3306 --host=${HOST} -q -R --databases ${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 {} \;
echo "备份数据库¥{DATABASE}成功"                                                                                                                                                                                                         

完成备份后进行解压
在这里插入图片描述
备份数据库部分完成,现在让他每天凌晨2:30备份
在这里插入图片描述
创建定时任务完成定时备份


网站公告

今日签到

点亮在社区的每一天
去签到