当前位置: 首页 > news >正文

Linux-之 简易:Shell编程

1 为什么要学习Shell编程

对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些Shel脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本.

对于大数据程序员来说,需要编写Shell程序来管理集群

2 Shell是什么

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便裕兴程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

3 Shell脚本的执行方式

1)sh脚本文件格式要求:

a.在内容的最前面以#!/bin/bash 开头

#!/bin/bash

b.脚本需要有可执行权限

如:创建一个hello.sh脚本

2)脚本的常用执行方式

a.方式1:

  • 首先要赋予xx.sh脚本的+x权限:chmod 744 myShell.sh
chmod u+x hello.sh
  • 执行脚本:./myShell.sh
./hello.sh

b.方式2:(sh+脚本)

  • 说明:不用赋予+x权限,直接执行即可
sh hello.sh

4 shell的变量

1)shell变量的介绍:

Linux Shell的变量分为,系统变量和用户自定义变量

  • 系统变量:$HOME、$PWD、$SHELL、$USER等等
  • 显示当前shell中所有变量:set指令
set

2)shell变量的自定义

基本语法:

  • 定义变量:
//等号=两边不能有空格
变量=值
  • 撤销变量:
unset 变量
  • 声明静态变量:
//注意:静态变量不能撤销set
readonly 变量

如:

3)定义变量的规则

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头
  • 等号两侧不能有空格
  • 变量名称一般习惯为大写

4)将命令的返回值赋给变量

``:反引号,表示执行里面的指令,并将结果赋值给定义的变量

//表示执行data指令,并将data指令执行的结果,赋值给变量A
A=`date`

$():等价于``

A=`date`
等价于
A=$(date)

如:

5)设置环境变量

基本语法:

  • 将shell变量输出为环境变量(全局变量)
export 变量名=变量值

修改全局/环境变量后,需要刷新配置文件,才可以生效

  • 让修改后的配置文件信息立即生效
source 配置文件
  • 查询环境变量的值
echo $变量名

如:

6)多行注释

:<<!需要注释的内容
!

7)位置参数变量

当我们执行一个shell脚本时,如果希望获取到命令行的参数信息就可以使用到位置参数变量。比如: ./myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell脚本中传参100,200。

基本语法:

//n为数字,`$0`代表命令本身,`$1-$9`代表第一到第九个参数,10以上的参数需要用大括号包含,如`${10}`
$n//这个变量代表命令行中所有的参数,`$*`把所有的参数看成一个整体
$*//这个变量也代表命令行中所有的参数,不过`$@`把每个参数区分对待
$@//这个变量代表命令行中所有参数的个数
$#

如:

8)预定义变量

shell设计者事先已经定义好的变量,可以直接在shell脚本中使用

基本语法:

//当前进程的进程号(PID)
$$//后台运行的最后一个进程的进程号(PID)
$!//最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确。
$?//后台运行,在脚本文件后面加上 & 即是进行后台运行
脚本文件.sh &

5 运算符

1)算术运算符

在Shell中进行各种运算操作

语法:

$[运算式]
或
$((运算式))
或
expr m + n

注意:

  • expr m + n,注意expr运算符间要有空格
  • expr m - n
  • expr \* / %,乘,除,取余

如:

2)比较运算符

字符串类型比较:

  • =:字符串比较

整数类型比较:

  • -lt:小于
  • -le:小于等于
  • -eq:等于
  • -gt:大于
  • -ge:大于等于
  • -ne:不等于

6 条件判断

1)基本语法:

[ condition ]
  • [ condition ],注意condition前后有空格!
  • 非空返回true,可使用$?验证(0为true,>1为false)

2)字符串比较判断

如:判断ok是否等于ok,等于输出相等

if [ "ok" = "ok" ]
thenecho "相等"
fi

3)数值比较判断

如:判断12是否大于9,大于输出大于

if [ 12 -gt 9 ]
thenecho "大于"
fi

4)按照文件权限进行判断

  • -r:有读的权限
  • -w:有写的权限
  • -x:有执行的权限

如:判断是否对a.txt有写的权限,有写的权限会输出有写的权限

if [ -w a.txt ]
thenecho "有写的权限"
fi

其他同理

5)按照文件类型进行判断

  • -f:文件存在并且是一个常规的文件
  • -e:文件存在
  • -d:文件存在并且是一个目录

如:判断a.txt文件是否存在,存在,在控制台输出文件存在

if [ -e a.txt ]
thenecho "文件存在"
fi

其他同理

7 流程控制

1)if语句

基本语法:

  • 单分支
if [ 条件判断式 ]
then程序
fi
  • 多分支
if [ 条件判断式 ]
then程序elif [ 条件判断式 ]
then程序
fi

2)case语句

基本语法:

case $变量名 in
“值1”)
变量匹配值1,则执行这里
;;“值2”)
变量匹配值2,则执行这里
;;…省略其他分支…*)
如果变量的值都不匹配,则执行这里
;;
esac

3)for循环

基本语法1:

for 变量 in 值1 值2 值3…
do执行的代码
done

基本语法2:

for ((初始值;循环控制条件;变量变化))
do执行的代码
done

案例1:循环输出填写的参数

for $A in $@
doecho $A
done

案例2:求和:求1-10相加的总和

4)while循环

基本语法1:

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

注意: [ 条件判断式 ] :[]和里面的条件判断式之间有空格

8 read读取控制台的输入

基本语法:

read [选项] (参数)

选项:

  • -p:指定读取值时的提示符
  • -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。

参数:

  • 变量:指定读取值的变量名

案例:读取控制台输入的一个NUM值,要求在10秒输入,10不输入,就默认退出

read -p "请输入一个数字=" -t 10s  NUM
echo $NUM

9 函数

1)系统函数

basename函数
  • 返回完整路径最后/的部分,常用于获取文件名

语法:

basename [pathname] [suffix]
  • basename命令会删掉所有的前缀包括最后一个/
  • 选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉

案例1:

basename /aa/bb/cc/a.txt

得到a.txt字符串

案例2:

basename /aa/bb/cc/a.txt .txt

得到去掉后缀的文件名

dirname函数
  • 返回完整路径最后/的前面的部分,常用于返回路径部分

语法:

dirname 文件绝对路径
  • 从给定的包含文件名的绝对路径中返回目录部分

案例:

dirname /aa/bb/cc/a.txt

得到路径:/aa/bb/cc

2)自定义函数

基本语法:

function 函数名(){执行语句[return int;] //有返回值的时候
}

调用函数语法:

函数名 参数

如:编写一个函数计算两个数的和

10 Shell编程综合案例

1)需求分析:

  1. 每天凌晨2:10备份数据库atguiguDB到/data/backup/db
  2. 备份开始和备份结束能够给出相应的提示信息
  3. 备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如:2018-03-12_230201.tar.gz
  4. 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。

2)实现流程

实现流程如下:

  • 先创建一个shall.sh脚本文件,用于实现数据库的备份和备份文件的删除,以及提示
  • 使用crond定时器来定时调用该脚本文件

3)实现

编写脚本文件

先编写脚本文件mysql_rjx.sh

//进入到/sbin目录
cd /sbin//创建,并编辑.sh脚本文件
vim mysql_rjx.sh

编辑脚本文件内容

#!/bin/bash#备份目录
BACKUP=/data/backup/db
#获取当前时间
DATETIME=`date "+%Y-%m-%d_%H%M%S"`
echo $DATETIME#数据库访问地址
HOST=localhost
#数据库用户名
DB_USER=root
#数据库密码
DB_PW=rjx666aaa
#需要备份的数据库
DATABASE=rjxedu#创建备份目录,如果目录不存在,就创建
if [ ! -d "$BACKUP/$DATETIME" ]
thenmkdir -p $BACKUP/$DATETIME
fi#开始备份数据库
mysqldump -u$DB_USER -p$DB_PW --host=$HOST -q -R --databases $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz#将文件打包为.tar.gz格式
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME#删除.sql.gz的文件及其父目录
rm -rf $DATETIME#删除10天前的备份文件
find $BACKUP -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份数据库$DATABASE 成功"
创建定时器,执行脚本文件
crontab -e
并编辑
30 2 * * * /usr/sbin/mysql_rjx.sh
示意图

指令解释:

#开始备份数据库
mysqldump -u$DB_USER -p$DB_PW --host=$HOST -q -R --databases $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz

#删除10天前的备份文件
find $BACKUP -atime +10 -name "*.tar.gz" -exec rm -rf {} \;

相关文章:

Linux-之 简易:Shell编程

1 为什么要学习Shell编程 对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些Shel脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本. 对于大数据程序员来说,需要编写Shell程序来管理集群 2 Shell是什么 Shell是一个命令行解释器&#xff…...

vue3的api风格

Vue的组件有两种不同的风格&#xff1a;组合式API 和 选项式API 选项式api 选项式API&#xff0c;可以用包含多个选项的对象来描述组件的逻辑&#xff0c;如&#xff1a;data&#xff0c;methods&#xff0c;mounted等。 组合式api setup&#xff1a;是一个标识&#xff0c;告…...

MySQL 开源到商业(五):开源 vs 养家糊口

前文提到&#xff0c;Oracle 收购了 Sun 之后&#xff0c;既没有像 Monty 预测的那样修改 MySQL 开源 License&#xff0c;也没有减少 MySQL 的研发投入。恰恰相反&#xff0c;Oracle 在持有 MySQL 知识产权的十几年里大幅提升了 MySQL 的工程质量&#xff0c;并且增加了很多用…...

进程信号(1)

目录 一、信号 1.1、生活中的信号 1.2、Linux中的信号 二、信号处理常见方式 三、信号的产生 3.1、简单理解信号的保存和发送 3.2、键盘产生信号 3.3、核心转储 3.4、系统调用接口产生信号 3.4.1、kill 3.4.2、raise 3.4.3、abort 3.5、软件条件产生信号 3.6、硬…...

Pytorch入门(7)—— 梯度累加(Gradient Accumulation)

1. 梯度累加 在训练大模型时&#xff0c;batch_size 最大值往往受限于显存容量上限&#xff0c;当模型非常大时&#xff0c;这个上限可能小到不可接受。梯度累加&#xff08;Gradient Accumulation&#xff09;是一个解决该问题的 trick梯度累加的思想很简单&#xff0c;就是时…...

day12

第一题 本题我们可以使用以下方法&#xff1a; 方法一&#xff1a; 使用hash表<元素&#xff0c;出现次数>来统计字符串中不同元素分别出现的次数&#xff0c;当某一个元素的次数大于1时&#xff0c;返回false&#xff0c;如果每个元素的出现次数都为1&#xff0c;则返回…...

MySQL技术点合集

目录 1. MySQL目录 2. 验证是否首次登陆方法 3. 在Liunx中使用命令来输入sql语句方法 4. 获取修改密码 5. 关闭密码策略 6. 忘记MySQL密码找回 7. 旋转90度横向查看表 8. 添加一个远程连接的用户 1. MySQL目录 /usr/bin/mysql相关命令vim /etc/my.cnfmysql配置文件ls /…...

记录使用 Vue3 过程中的一些技术点

1、自定义组件&#xff0c;并使用 v-model 进行数据双向绑定。 简述&#xff1a; 自定义组件使用 v-model 进行传参时&#xff0c;遵循 Vue 3 的 v-model 机制。在 Vue 3 中&#xff0c;v-model 默认使用了 modelValue 作为 prop 名称&#xff0c;以及 update:modelValue 作为…...

6. C++通过fork的方式实现高性能网络服务器

我们上一节课写的tcp我们发现只有第一个与之连接的人才能收发信息。他又很多的不足 高性能网络服务器 通过fork实现高性能网络服务器 我们通过fork进行改装之后就可以成百上千的用户进行连接访问&#xff0c;对于每一个用户来说我们都fork一个子进程。让后让每一个子进程都是…...

直播美颜插件、美颜SDK详解:技术、功能与实现原理

今天&#xff0c;小编将详细解析直播美颜插件和美颜SDK的技术、功能以及实现原理。 一、美颜技术的背景与发展 1.1美颜技术的兴起 随着直播平台的普及&#xff0c;美颜SDK技术逐渐被集成到直播软件中&#xff0c;以满足用户对更美观、自然的直播效果的需求。 1.2美颜技术的…...

MyBatis入门(1)

目录 一、JDBC操作回顾 二、什么是MyBatis&#xff1f; 三、MyBatis入门 1、准备工作 &#xff08;1&#xff09;创建工程 &#xff08;2&#xff09;数据准备 2、配置数据库连接字符串 3、写持久层代码 4、单元测试 &#xff08;1&#xff09;使用IDEA自动成成测试类…...

打开服务器远程桌面连接不上,可能的原因及相应的解决策略

在解决远程桌面连接不上服务器的问题时&#xff0c;我们首先需要从专业的角度对可能的原因进行深入分析&#xff0c;并据此提出针对性的解决方案。以下是一些可能的原因及相应的解决策略&#xff1a; 一、网络连接问题 远程桌面连接需要稳定的网络支持&#xff0c;如果网络连接…...

用于时间序列概率预测的蒙特卡洛模拟

大家好&#xff0c;蒙特卡洛模拟是一种广泛应用于各个领域的计算技术&#xff0c;它通过从概率分布中随机抽取大量样本&#xff0c;并对结果进行统计分析&#xff0c;从而模拟复杂系统的行为。这种技术具有很强的适用性&#xff0c;在金融建模、工程设计、物理模拟、运筹优化以…...

VScode解决报错“Remote-SSH XHR failed无法访问远程服务器“的方案

VScode解决报错"Remote-SSH XHR failed无法访问远程服务器"的方案 $ ls ~/.vscode-server/bin 2ccd690cbff1569e4a83d7c43d45101f817401dc稳定版下载链接&#xff1a;https://update.code.visualstudio.com/commit:COMMIT_ID/server-linux-x64/stable 内测版下载链接…...

Python高级进阶--dict字典

dict字典⭐⭐ 1. 字典简介 dictionary&#xff08;字典&#xff09; 是 除列表以外 Python 之中 最灵活 的数据类型&#xff0c;类型为dict 字典同样可以用来存储多个数据字典使用键值对存储数据 2. 字典的定义 字典用{}定义键值对之间使用,分隔键和值之间使用:分隔 d {中…...

记忆力和人才测评,如何提升记忆力?

什么是记忆力&#xff1f; 如何通俗意义上的记忆力&#xff1f;我们可以把人的经历、经验理解成为一部纪录片&#xff0c;那么已经过去发生的事情&#xff0c;就是影片之前的情节&#xff0c;对于这些信息&#xff0c;在脑海里&#xff0c;人们会将其进行处理和组合&#xff…...

数据仓库建模

目录 数仓建模 为什么要对数据仓库进行分层 主题 主题的概念 维度建模&#xff1a; 模型的选择&#xff1a; 星形模式 雪花模型 星座模式 拉链表 维度表和事实表&#xff1a; 维度表 事实表 事实表设计规则 退化维度 事务事实表、周期快照事实表、累积快照事实…...

力扣:1738. 找出第 K 大的异或坐标值

1738. 找出第 K 大的异或坐标值 给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, b) 的 值 可由对所有满足 0 < i < a < m 且 0 < j < b < n 的元素 matrix[i][j]&#xff08;下标从 0 开始计数&…...

Keras深度学习框架第二十讲:使用KerasCV中的Stable Diffusion进行高性能图像生成

1、绪论 1.1 概念 为便于后文讨论&#xff0c;首先进行相关概念的陈述。 Stable Diffusion&#xff1a;Stable Diffusion 是一个在图像生成领域广泛使用的技术&#xff0c;尤其是用于文本到图像的转换。它基于扩散模型&#xff08;Diffusion Models&#xff09;&#xff0c;这…...

C/C++ vector详解

要想了解STL&#xff0c;就必须会看&#xff1a; cplusplus.comhttps://legacy.cplusplus.com/ 官方内容全都是英文的&#xff0c;可以参考&#xff1a; C/C初始识https://blog.csdn.net/2301_77087344/article/details/138596294?spm1001.2014.3001.5501 vector&#xff…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...