Linux 2021韩顺平网课笔记:shell编程
基本介绍
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell脚本的执行方式
格式要求
- 脚本以
#!bin/bash开头,表明以bashell执行 - 脚本需要有可执行权限
- shell脚本约定俗成以.sh结尾
编写Shell脚本
需求说明:创建一个Shell脚本,输出hello,world!
单行注释:
#
多行注释:
:<<!
内容
!
常用执行方式
xxx.sh 或者 /xxxx/xx/xxx.sh
直接通过相对路径或者绝对路径执行。
注意执行者需要对 hello.sh 有x(执行)权限。
sh xxx.sh的相对路径或者绝对路径
不用赋予脚本+x权限,直接执行即可。
变量
Linux Shell中的变量分为:系统变量和用户自定义变量。
系统变量:$HOME,$PWD,$SHELL,$USER等等
显示当前shell中所有变量:set
变量的定义
基本语法
定义变量:变量名=值(不要打空格)
撤销变量:unset 变量
声明静态变量:readonly 变量(静态变量不会被反复定义和初始化,只会被定义一次,不能unset)
快速入门
案例1:定义变量A
案例2:撤销变量A
案例3:声明静态的变量,验证不能unset
案例4:可把变量提升为全局环境变量,可供其他shell程序使用[该案例后面讲]
变量的命名和赋值规则
定义变量的规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(不可以)
- 等号两侧不能由空格。
- 变量名称一般习惯为大写(这是一个规范,我们遵守即可)
将命令的返回值赋给变量
A=`date` 或者 A=$(date)
运行里面的命令,并把结果返回给变量A(没有反引号,会认为是单词赋给A)。
设置环境变量
基本语法
export 变量名=变量值
将shell变量输出为环境变量/全局变量
source 配置文件
让修改后的配置信息立即生效
echo $变量名
查询环境变量的值
快速入门
在/etc/profile文件中定义 STAR_HOME 环境变量
查看环境变量 STAR_HOME 的值,在输出环境变量前,需要让其生效
在另外一个shell程序中使用 STAR_HOME
位置参数变量
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。
比如:./myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息。
基本语法
$n
n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}
$*
这个变量代表命令行中所有的参数,*把所有的参数看成一个整体
$@
这个变量也代表命令行中所有的参数,不过@把每个参数区分对待
$#
这个变量代表命令行中所有参数的个数
快速入门
编写一个shell脚本myshell.sh,在脚本中获取到命令行的各个参数信息。
预定义变量(了解即可)
就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用。
基本语法
$$
当前进程的进程号(PID)
$!
后台运行的最后一个进程的进程号(PID)
$?
最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
快速入门
在一个shell脚本中简单使用一下预定义变量 preVar.sh
卡住的原因是在一个脚本里执行另外一个脚本,按ctrl+C退出。
运算符
基本语法
$((运算式))
$[运算式]
expr m + n
注意expr运算符间要有空格,如果希望将expr的结果赋给某个变量,使用``括起来。
+、-、\*、 /、 % 分别表示加,减,乘,除,取余。
快速入门
案例1:计算(2+3)*4的值
案例2:请求出命令行两个参数[整数]的和,比如20和50
条件判断
判断语句
if [ condition ] # 注意condition前后要有空格
then...
fi
非空返回true,可使用$?验证(0为true,>1为false)。
常用判断条件
-
字符串比较
= -
两个整数的比较
-lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于 -
按照文件权限进行判断
-r 有读的权限 -w 有写的权限 -x 有执行的权限 -
按照文件类型进行判断
-f 文件存在并且是一个常规的文件 -e 文件存在 -d 文件存在并是一个目录
快速入门
案例1:“ok”是否等于“ok”
案例2:23是否大于等于22
案例3:目录中的文件是否存在
流程控制
if 判断
单分支
if [ 条件判断式 ]
then代码
fi
多分支
if [ 条件判断式 ]
then代码
elif [ 条件判断式 ]
then代码
fi
注意事项:[ 条件判断式 ],中括号和条件判断式之间必须有空格。
快速入门
案例:请编写要给shell程序,如果输入的参数,大于等于60,则输出“及格了”,如果小于60,则输出”不及格“
case语句
基本语法
case $变量名 in
”值1“)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
快速入门
案例:当命令行参数是1时,输出“周一”,是2时,就输出“周二”,其他情况输出“other”
for循环
基本语法
for 变量 in 值1 值2 值3 # 值外面可以加双引号
do程序/代码
done
for((初始值;循环控制条件;变量变化))
do程序/代码
done
快速入门
案例1:打印命令行输入的参数
案例2:从1加到100的值输出显示
while循环
基本语法
while [ 条件判断式 ]
do
程序
done
注意:while和 [有空格,条件判断式和 [也有空格。
快速入门
案例:从命令行输入一个数n,统计从1+…+n的值是多少?
read读取控制台输入
基本语法
read(选项)(参数)
选项:
-p:指定读取值的提示符
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
参数
变量:指定读取值的变量名
快速入门
案例1:读取控制台输入一个NUM1值
案例2:读取控制台输入一个NUM2值,在3秒内输入
函数
shell编程和其他编程语言一样,有系统函数,也可以自定义函数。系统函数中,我们这里就介绍两个。
系统函数
basename
basename [pathname] [suffix]
basename [string] [suffix]
功能:返回完整路径最后/的部分,常用于获取文件名
选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
dirname
dirname 文件绝对路径
功能:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
自定义函数
基本语法
函数定义
function funname[()]
{Action;[return int;]
}
调用函数时,直接写函数名
funname [值]
快速入门
案例1:计算输入两个参数的和(动态获取),getSum
综合案例
需求分析
- 每天凌晨2:30备份数据库hspedu到/data/backup/db
- 备份开始和备份结束能够给出相应的提示信息
- 备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如:2021-03-12_230201.tar.gz
- 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
cd /user/sbin
vim mysql_db_backup.sh//.sh文件内容
#!/bin/bash
# 备份目录
BACKUP=/data/backup/db
# 当前时间
DATETIME=$(date +%Y-%m-%d_%H%M%S)
echo $DATETIME
# 数据库的地址
HOST=localhost
# 数据库的用户名
DB_USER=root
# 数据库密码
DB_PW=hspedu100
# 备份的数据库名
DATABASE=hspedu# 创建备份目录,如果不存在,就创建
[ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"# 备份数据库
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}
# 删除对应的备份
rm -rf ${BACKUP}/${DATETIME}# 删除十天前的备份文件(atime是访问时间)
find ${BACKUP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份数据库${DATEBASE} 成功~"
//.sh文件内容结束crontab -e
# 填入内容
30 2 * * * /usr/sbin/mysql_db_backup.sh相关文章:
Linux 2021韩顺平网课笔记:shell编程
基本介绍 Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。 Shell脚本的执行方式 格式要求 脚本以 #!bin/bash 开头,表明以bashell…...
软考 中级软件设计师 考点知识点笔记总结 day09 操作系统进程管理
文章目录 4、操作系统基本原理4.1 、进程管理**4.1.1 、进程同步机制****4.1.2 、进程互斥机制****4.1.3 、信号量机制****4.1.4 、PV操作实现前驱操作****4.1.5 、死锁**4.1.6 、银行家算法 4、操作系统基本原理 进程管理 存储管理 文件管理 设备管理 微内核操作系统 操作系…...
大模型和AIGC同质化浪潮下的信息困局与破局之道,面向未来的认知革命
欢迎来到涛涛聊AI。看到网上太多雷同的内容有感后,让AI批判下AI。 一、技术趋同引发的信息生态危机 当前互联网正被海量AI生成内容淹没,这种现象的根源在于技术底层的高度同质化。全球主流大模型90%以上基于相同算法架构开发,采用近似的训练…...
⼆、Kafka客户端消息流转流程
这⼀章节将重点介绍Kafka的HighLevel API使⽤,并通过这些API,构建起Kafka整个消息发送以及消费的主线流程。 Kafka提供了两套客户端API,HighLevel API和LowLevel API。 HighLevel API封装了kafka的运⾏细节,使⽤起来⽐较简单&…...
es 3期 第28节-深入掌握集群组建与集群设置
#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性ÿ…...
如何在 SwiftUI 视图中使用分页(Paging)机制显示 SwiftData 数据(三)
概述 小伙伴们都知道,自从有了 SwiftData 的加持,现在 SwiftUI 可以非常惬意的利用描述型命令创建以数据驱动为本的视图了。这在测试或演示小项目中工作的完美无缺,不过真实世界要“残酷”的多。 实际情况是,我们无法一次性将海量数据统统拉入内存以便在 SwiftUI 中显示,…...
git和VScode
游戏存档保存的是游戏的进度 git保存的是代码的进度 Vscode和git 要正常的使用git首先要设置姓名和邮箱 要配合gitee(也可以是其他平台,以gitee举例)使用,首先创造一个gitee账号,复制邮箱和用户名 在VScode中找到…...
Linux Vim 编辑器的使用
Vim 编辑器的使用 一、安装及介绍二、基础操作三、高级功能四、配置与插件 一、安装及介绍 Vim是一款强大且高度可定制的文本编辑器,相当于 Windows 中的记事本。具备命令、插入、底行等多种模式。它可通过简单的键盘命令实现高效的文本编辑、查找替换、分屏操作等…...
NLP语言模型训练里的特殊向量
1. CLS 向量和 DEC 向量的区别及训练方式 (1) CLS 向量与 DEC 向量是否都是特殊 token? CLS 向量([CLS] token)和 DEC 向量(Decoder Input token)都是特殊的 token,但它们出现在不同类型的 NLP 模型中&am…...
利用Canvas在紫微斗数命盘上画出三方四正
许多紫微斗数排盘程序都会在命盘上画出三方四正的指示线,便于观察命盘。本文用Canvas在一个模拟命盘上画出三方四正指示线。 模拟命盘并画出“子”宫三方四正的HTML文件如下: <!doctype html> <html lang"en"> <head><…...
传统汽车 HMI 设计 VS 新能源汽车 HMI 设计,有何不同?
一、设计理念与目标的差异 传统汽车HMI设计的核心目标是辅助驾驶,强调功能的简洁性和操作的便捷性。其设计侧重于提供基础的车辆信息(如车速、转速、油量等),并确保驾驶员在操作时能够快速获取关键信息。相比之下,新能…...
【JavaWeb】前端基础
JavaWeb 前端三大件:HTML(主要用于网页主体结构的搭建),CSS(页面美化),JavaScript(主要用于页面元素的动态代理) 1. HTML 1.1 html概述 HTML:Hyper Text …...
SpringMVC组件解析
SpringMVC的执行流程 ① 用户发送请求至前端控制器DispatcherServlet。 ② DispatcherServlet收到请求调用HandlerMapping处理器映射器 ③ 处理器映射器找到具体的处理器(可以根据xm|配置、注解进行査找),生成处理器对象及处理器 拦截器(如果有则生成)一…...
使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例
1. 使用 Provider 实现局部刷新 示例 1:ChangeNotifier Consumer 通过 ChangeNotifier 和 Consumer 实现局部刷新。 import package:flutter/material.dart; import package:provider/provider.dart;void main() {runApp(ChangeNotifierProvider(create: (_) &g…...
数据结构C语言练习(两个栈实现队列)
一、引言 在数据结构的学习中,我们经常会遇到一些有趣的问题,比如如何用一种数据结构去实现另一种数据结构的功能。本文将深入探讨 “用栈实现队列” 这一经典问题,详细解析解题思路、代码实现以及每个函数的作用,帮助读者更好地…...
Java 基础-28- 多态 — 多态下的类型转换问题
在 Java 中,多态(Polymorphism)是面向对象编程的核心概念之一。多态允许不同类型的对象通过相同的方法接口进行操作,而实际调用的行为取决于对象的实际类型。虽然多态提供了极大的灵活性,但在多态的使用过程中…...
nextjs使用02
并行路由 同一个页面,放多个路由,, 目录前面加,layout中可以当作插槽引入 import React from "react";function layout({children,notifications,user}:{children:React.ReactNode,notifications:React.ReactNode,user:React.Re…...
第2.6节 iOS生成全量和增量报告
2.6.1 简介 在采集了覆盖率数据后,就需要生成对应需求的全量和增量覆盖率报告,以便对测试进行查漏补缺。IOS系统有两种开发语言,所以生成报告的方式也不相同,下面就分别介绍一下Object C和Swift语言如何生成覆盖率报告。 2.6.2 O…...
应用分享 | AWG技术突破:操控钻石氮空位色心,开启量子计算新篇章!
利用AWG操作钻石中的氮空位色彩中心 金刚石中的颜色中心是晶格中的缺陷,其中碳原子被不同种类的原子取代,而相邻的晶格位点则是空的。由于色心具有明亮的单光子发射和光学可触及的自旋,因此有望成为未来量子信息处理和量子网络的固态量子发射…...
前端开发学习路线完整指南
前端开发学习路线完整指南 前端开发是一个不断发展的领域,涉及多个技术栈。本文将为你提供一条系统的前端学习路线,帮助你从零基础到熟练掌握前端开发技能。 1. 前置知识 在学习前端之前,了解一些基础知识会对你的学习过程有很大帮助。 计…...
linux服务器专题2------vim编辑器如何设置显示行号
在 Vim 编辑器中,可以通过以下步骤来显示行号: 临时显示行号 打开 Vim 编辑器,输入如下命令: :set number这将临时启用行号显示。关闭 Vim 后,行号设置将丢失。 永久显示行号 如果希望在每次启动 Vim 时都显示行号…...
Jmeter触发脚本备份
JMeter 在以下情况会触发脚本备份: 手动保存测试计划时:如果测试计划有未保存的修改,当用户手动保存测试计划(脚本)时,JMeter 都会自动将当前脚本备份到${JMETER_HOME}/backups文件夹下。 关闭 JMeter 时…...
【视觉与语言模型参数解耦】为什么?方案?
一些无编码器的MLLMs统一架构如Fuyu,直接在LLM内处理原始像素,消除了对外部视觉模型的依赖。但是面临视觉与语言模态冲突的挑战,导致训练不稳定和灾难性遗忘等问题。解决方案则是通过参数解耦方法解决模态冲突。 在多模态大语言模型…...
重建二叉树(C++)
目录 1 问题描述 1.1 示例1 1.2 示例2 1.3 示例3 2 解题思路 3 代码实现 4 代码解析 4.1 初始化 4.2 递归部分 4.3 主逻辑 5 总结 1 问题描述 给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。 例如输入前序遍历序…...
VLAN、QinQ、VXLAN的区别
1、技术本质与封装方式 技术OSI层级封装原理标识位长度拓展性VLAN数据链路层L2在以太网帧头插入802.1Q Tag(单层VLAN标签)12位(4094个)有限,仅支持单一网络域内隔离QinQ数据链路层L2在原始VLAN标签外再封装一层802.1Q…...
保姆级教程:synchronized 同步方法 vs 同步代码块,看完彻底懂锁!
一、同步方法(锁住整个方法) 1. 代码示例 public class Counter {private int count 0;// 同步方法:锁住整个方法public synchronized void add() {count;}// 同步方法:锁住整个方法public synchronized void subtract() {coun…...
10乱码问题的解释(1)
在计算机中,一个汉字,占几个字节? 针对这个问题,只要你回答出一个具体的数字,就一定是错的!! 前提条件: 当前中文编码使用的是哪种方式(字符集) 计算机存的其实是二进制数字~~ 英文字母,怎么表示的?? ASCII 码表~~ 规定了每个字符,都有一个对应的数字来表示~~ 只是表示英文,…...
短视频文案--钓鱼女和滑板女
短视频文案 第一个文案: 1标题:风萧萧兮易水寒,美女钓鱼兮不复还 2内容: 我站在池边的微风中,再也看不到曾经快乐的少女了。 风很凉,凉得心不知前往何处。 水很清,清得深知这里没鱼群。 芦苇…...
算法设计学习3
实验目的及要求: 1.加强对结构体的应用。 2.熟悉字符计数排序。 实验设备环境: 1.微型计算机 2.DEV C(或其他编译软件) 实验步骤: 任务:要求使用自定义函数来实现 输入一段文本,统计每个字符出现的次数,按…...
nginx的自动跳转https
mkdir /usr/local/nginx/certs/ 创建一个目录 然后用openssl生成证书 编辑nginx的配置文件 自动跳转成功 做一个优化,如果访问的时候后面加了其他的uri也一起自动跳转了...
