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

shell编程

  • shell编程
    • shell脚本
    • 函数
  • 数据库备份

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++))
doSUM=$[$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备份
在这里插入图片描述
创建定时任务完成定时备份

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/642136.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NCF29A1 高端阻抗匹配

一、前言 Class E 高端 L-Front 匹配集成了额外的滤波器&#xff0c;提供了足够的谐波衰减&#xff0c;使 NCF29A1 与天线在比基频更高的频率下具有相当大的增益。向 PA 提供的阻抗和输出电容与表 1 ZPAOUT 所示相同。 二、原理图 图 1 高端 L-Front 匹配原理图 1&#xff…

lementui el-menu侧边栏占满高度且不超出视口

做了几次老是忘记&#xff0c;这次整理好逻辑做个笔记方便重复利用&#xff1b; 问题&#xff1a;elementui的侧边栏是占不满高度的&#xff1b;但是使用100vh又会超出视口高度不美观&#xff1b; 解决办法&#xff1a; 1.获取到侧边栏底部到视口顶部的距离 2.获取到视口的高…

vue实现水平排列且水平居中

样式实现 .body{text-align: center; } .body_content{display: inline-block; } .body_content_cardList{display: flex;flex-wrap: wrap;text-align: center; }<div class"body"><div class"body_content"><div class"body_content…

过滤器Filter和拦截器Interceptor心得

上一篇文章讲了监听器Listener&#xff0c;下面我们来讲一下过滤器和拦截器。 一、过滤器Filter。 首先&#xff0c;servlet容器&#xff08;比如tomcat&#xff09;肯定的要有servlet才能发挥它的光彩。在上古jsp时代&#xff0c;我们会写各种servlet通过不同的请求来实现我…

日志框架整合SpringBoot保姆级教程+日志文件拆分(附源码)

介绍 日志概述 只要程序员投身在实际的学习和生产环境中&#xff0c;就会对日志的重要性有着充分的认知&#xff0c;尤其是对于 Web 以及更高级的应用。在很多情况下&#xff0c;日志可能是我们了解应用如何执行的唯一方式。 但是现实是很多程序员对于日志的记录的认知比较肤…

基于CAPL的S19文件解析

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

计算IP地址总个数的方法及其应用

IP地址是计算机网络中用于唯一标识和定位设备的数字地址&#xff0c;是Internet Protocol&#xff08;IP&#xff09;的核心组成部分。计算IP地址的总个数是网络规划和管理中的重要任务之一&#xff0c;本文将介绍计算IP地址总个数的方法及其应用。 IP地址查询&#xff1a;IP数…

如何在PostgreSQL中创建一个新的数据库,并指定所有者?

文章目录 解决方案示例代码 PostgreSQL是一个强大的开源关系型数据库管理系统&#xff0c;它允许用户创建和管理多个数据库。在PostgreSQL中创建一个新的数据库并指定所有者是一个常见的操作。下面&#xff0c;我们将详细解释如何执行这一操作&#xff0c;并提供示例代码。 解…

e2e测试框架之Cypress

谈起web自动化测试&#xff0c;大家首先想到的是Selenium&#xff01;随着近几年前端技术的发展&#xff0c;出现了不少前端测试框架&#xff0c;这些测试框架大多并不依赖于Selenium&#xff0c;这一点跟后端测试框架有很大不同&#xff0c;如Robot Framework做Web自动化测试本…

【视频异常检测】Open-Vocabulary Video Anomaly Detection 论文阅读

Open-Vocabulary Video Anomaly Detection 论文阅读 AbstractMethod3.1. Overall Framework3.2. Temporal Adapter Module3.3. Semantic Knowledge Injection Module3.4. Novel Anomaly Synthesis Module3.5. Objective Functions3.5.1 Training stage without pseudo anomaly …

Spingboot人工智能工程应用框架,你要干的活全部交给它

欢迎来到 Spring AI 项目&#xff01; Spring AI 项目为开发 AI 应用程序提供了 Spring 友好的 API 和抽象。 让你变得Beans聪明起来&#xff01; 有关更多信息&#xff0c;请参阅我们的Spring AI 参考文档。 项目链接 文档 问题 讨论- 如果您有问题、建议或反馈&#xf…

「GO基础」GO程序组成要素

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…