Linux 之 shell 脚本
Linux 之 shell 脚本
- 1、脚本的格式要求
- 2、shell 脚本常用执行方式
- 2.1、绝对路径或相对路径方式
- 2.2、sh+脚本方式(不推荐)
- 3、shell 的变量
- 3.1、定义 shell 变量
- 3.2、将命令返回值赋值给变量 (重点)
- 3.3、设置环境变量
- 3.4、位置参数变量
- 3.5、预定义变量
- 4、运算符
- 5、条件判断
- 6、流程控制
- 6.1、if 判断
- 6.2、case 语句
- 6.3、for 循环
- 6.4、while 循环
- 7、read 读取控制台输入
- 8、函数
- 8.1、常用系统函数 basename
- 8.2、常用系统函数 dirname
- 8.3、自定义函数
- 9、shell 综合案例
shell 是一个命令行解释器,它为用户提供了一个向 linux 内核发送请求,以便运行程序的界面系统级程序。用户可以使用 shell 来启动、挂起、停止甚至编写一些程序。
1、脚本的格式要求
-
①、脚本以
#!/bin/bash
开头。 -
②、脚本需要有可执行权限。
2、shell 脚本常用执行方式
2.1、绝对路径或相对路径方式
# 输入shell 脚本的绝对路径或相对路径的方式,执行shell脚本# 首先 需要对 shell 脚本 赋执行权限
chmod 744 test_shell.sh
# 相对路径的方式执行
./test_shell.sh
# 绝对路径的方式执行
/usr/myshell/test_shell.sh
2.2、sh+脚本方式(不推荐)
使用该方式不需要 赋予shell脚本执行权限,直接执行即可。
sh ./test_shell2.sh
3、shell 的变量
shell 的变量分为:系统变量 和 用户自定义变量。
-
系统变量: H O M E 、 HOME、 HOME、PWD、 S H E L L 、 SHELL、 SHELL、USER 等
# 输出系统变量 echo "path = $PATH" echo "user = $USER"
3.1、定义 shell 变量
# 定义变量: 变量=值,示例:
A=100
# 撤销变量: unset 变量, 示例:
unset A
# 声明静态变量:readonly 变量。注意:静态变量不能 unset。示例:
readonly B=101
# 把变量提升为全局环境变量,可供其他shell程序使用。
定义变量的规则
- ① 变量名称可以由字母、数字和下划线组成,但不能以数字开头。
- 等号两侧不能有空格。
- 变量名称一般习惯为大写。
3.2、将命令返回值赋值给变量 (重点)
# 两种方式
# 方式一:反引号,运行里面的命令,并把结果返回给变量。示例:
A=`ls -la`
# 方式二:等同于反引号。示例:
A=$(ls -la)
3.3、设置环境变量
环境变量所在文件:
1.系统级:
- ① /etc/profile:该文件是用户登录时,操作系统定制用户环境时使用的第一个文件,应用于登录到系统的每一个用户。该文件一般是调用/etc/bash.bashrc文件。
/etc/bash.bashrc:系统级的bashrc文件。 - ② /etc/environment:在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量。
2.用户级(这些文件处于家目录下):
- ① ~/.profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方
- ② ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。不推荐放到这儿,因为每开一个shell,这个文件会读取一次,效率肯定有影响。
~/.bash_profile or ~./bash_login:这里没有引用作者的,下面会提到
~/.pam_environment:用户级的环境变量设置文件,没有做测试,不知道管不管用。
# 基本语法
# 将 shell 变量输出为环境变量
export 变量名=变量值
# 让修改后的配置信息立即生效
source 配置文件
# 查询环境变量的值
echo $变量名# 示例:
export TOMCAT_HOME=/opt/tomcat
# 生效
source /etc/profile
3.4、位置参数变量
当我们执行一个 shell 脚本时,某些场景需要获取到执行 shell脚本的命令行参数信息,那么就可以使用位置参数变量。
基本语法:
命令 | 功能说明 |
---|---|
$n | n 为数字,$0 代表命令本身,$1- 9 代表第一个到第九个参数,十以上的参数需要用大括号包含,例: 9 代表第一个到第九个参数,十以上的参数需要用大括号包含,例: 9代表第一个到第九个参数,十以上的参数需要用大括号包含,例:{10} |
$* | 代表命令行中所有的参数,$*把所有的参数看成一个整体 |
$@ | @ 也代表命令行中所有的参数,不过 @也代表命令行中所有的参数,不过 @也代表命令行中所有的参数,不过@把每个参数区分对待 |
$# | 代表命令行中所有参数的个数 |
[root@myCentos6 zim]# vim test.sh#!/bin/bash
echo "获取并打印命令行参数"
echo "$0 $1 $2"
echo "打印全部参数: $*"
echo "打印全部参数-> $@"
echo "参数个数 = $#"[root@myCentos6 zim]# ls -l
总用量 4
-rw-r--r--. 1 root root 154 8月 28 11:45 test.sh
[root@myCentos6 zim]# chmod 744 test.sh
[root@myCentos6 zim]# ls -l
总用量 4
-rwxr--r--. 1 root root 154 8月 28 11:45 test.sh
[root@myCentos6 zim]# ./test.sh aa 100
获取并打印命令行参数
./test.sh aa 100
打印全部参数: aa 100
打印全部参数-> aa 100
参数个数 = 2
[root@myCentos6 zim]#
3.5、预定义变量
预定义变量,就是 shell 脚本设计者事先已经定义好的变量,可以直接在shell脚本中使用。预定义变量是一开始执行Script脚本时就会设定,且不能被修改,预定义变量当一执行程序时就有了。
基本用法:
-
$$ :当前进程的进程号PID。
-
$! :后台运行的最后一个进程的进程号pid。
-
$? :最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数字,由命令自己决定),则证明上一个命令执行错误。
4、运算符
# 基本语法
# 方式一: $((运算式)) 示例:
RESULT=$((2+3)*4)
echo "result=$RESULT"
# 方式二: $[运算式] 示例:
RESULT=$[(2+3)*4]
echo "result=$RESULT"
# 求两个参数的和
SUM=$[$PARAM1+$PARAM2]
# 方式三: expr m+n 注意:expr 运算符间要有空格
# expr \*,/,% 分别代表 乘,除,取余
TEMP=`expr 2 + 3`
RESULT=`expr $TEMP \* 4`
echo "result=RESULT"
5、条件判断
# 判断语句,基本语法. 注意:condition 前后要有空格
# 非空返回 true,可使用 $? 验证(0 为 true, >1 为 false)
[ condition ]
# 应用实例: [ test_condition ] 返回true
[ test_condition ]
# [] 返回false
[]
# 条件满足,执行后面的语句
[ condition ] && echo "ok" || echo "not ok"# 案例:"ok 是否等于 ok"
if [ "ok100" = "ok" ]
then echo "equal"
fi# 案例:/root/install.log 目录中的文件是否存在
if [ -e /root/install.log ]
then echo "文件存在"
fi
常用判断条件
- 两个整数的比较
- = 字符串比较
- -lt 小于
- -le 小于等于
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
- 按照文件权限进行判断
- -r 有读的权限 [ -r 文件 ] (注意前后有空格)
- -w 有写权限
- -x 有执行权限
- 按照文件类型进行判断
- -f 文件存在并且是一个常规的文件
- -e 文件存在
- -d 文件存在并是一个目录
6、流程控制
6.1、if 判断
# 基本语法
if [ 条件判断式 ];then程序
fi
# 或者 基本语法 (推荐使用)
if [ 条件判断式 ]then程序elif [ 条件判断式 ]then 程序fi
注意事项:[ 条件判断式 ] ,中括号和条件判断式之间必须有空格。
6.2、case 语句
# 基本语法
case $变量名 in
"值1")如果变量的值等于值1,则执行程序1;;
"值2") 如果变量的值等于值2,则执行程序2;;… 省略其他分支 …
*)如果变量的值都不是以上的值,则执行此程序;;
esac# 应用示例:命令行参数是 1时,输出"周一",是2时输出"周二",其他情况输出"other"
#!/bin/bash
case $1 in
"1")echo "周一";;
"2")echo "周二";;
*)echo "other";;
esac
6.3、for 循环
# 基本语法1
for 变量 in 值1 值2 值3…do 程序done# 示例: 打印命令行输入的参数
#!/bin/bash
for i in "$*"
doecho "the param is $i"
done
# 或
for j in "$@"doecho "the num is $j"
done # 基本语法2
for ((初始值;循环控制条件;变量变化))do 程序
done# 示例:从1加到100 的值,输出显示
#!/bin/bash
SUM=0
for((i=1.i<=100;i++))
do SUM=$[$SUM+$i]
done
echo "sum=$SUM"
6.4、while 循环
# 基本语法1
while[ 条件判断式 ]
do 程序
done
# 应用示例:从命令行输入一个数n,统计从1+…+ n 的值是多少
#!/bin/bash
SUM=0
i=0
while[ $i -le $1 ]
doSUM=$[$SUM+$i]i=$[$i+1]
done
echo "sum= $SUM"
7、read 读取控制台输入
# 基本语法
read [选项] [参数]
# 常用选项-p : 指定读取值时的提示符-t : 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不等待
# 常用参数变量:指定读取值的变量名# 应用实例1: 读取控制台输入的 num 值 并打印
#!/bin/bash
read -p "请输入一个数num1=" NUM1
echo "您输入的值时num1=$NUM1"# 应用实例2: 读取控制台输入的 num 值,在10秒内输入,并打印
#!/bin/bash
read -t 10 -p "请输入一个数num2=" NUM2
echo "您输入的值时num2=$NUM2"
8、函数
shell 编程和其他编程语言一样,有系统函数,也可以自定义函数。
8.1、常用系统函数 basename
# basename 函数功能:返回完整路径最后 / 的部分,常用于获取文件名
# suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉
basename [pathname] [suffix]
# 应用示例: 返回/home/aaa/test.txt 的 "test"部分
basename /home/aaa/test.txt .txt
# 应用示例: 返回/home/aaa/test.txt 的 "test.txt"部分
basename /home/aaa/test.txt
8.2、常用系统函数 dirname
# dirname 函数功能:返回完整路径最后 / 的前面部分,常用于返回路劲部分
# 从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回目录部分。
dirname 文件绝对路径# 应用实例: 返回 /home/aaa/test.txt 的 /home/aaa
dirname /home/aaa/test.txt
8.3、自定义函数
# 基本语法
[ function ] funname[()]
{Action;[return int;]
}
# 调用直接写函数名: funname [值]# 应用实例:计算输入两个参数的和 (read),getSum
#!/bin/bash
function getSum() {SUM=$[$n1+$n2]echo "sum=$SUM"
}read -p "请输入第一个数n1" n1
read -p "请输入第二个数n2" n2getSum $n1 $n2
9、shell 综合案例
需求:
-
① 每天凌晨 2:10 备份数据库 myDb 到 /data/backup/db
-
② 备份开始和备份结束,能够给出相应的提示信息
-
③ 备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2023-08-28_230201.tar.gz
-
④ 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除。
在 /usr/sbin 目录下创建 mysql_db_backup.sh 脚本
vim /usr/sbin/mysql_db_backup.sh
编写 mysql_db_backup.sh 脚本
#!/bin/bash
# 备份的路径
BACKUP=/data/backup/db
# 当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
echo "==开始备份数据库myDb=="
echo "==备份的路径是 $BACKUP/$DATETIME.tar.gz=="
# 主机
HOST=localhost
# 用户名
DB_USER=root
# 密码
DB_PWD=root
# 备份数据库名称
DATABASE=myDB
# 创建备份的路径
# 如果备份的路径文件夹存在就直接使用,否则就创建
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
# 执行 mysql 的备份数据库的指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
# 打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
# 删除临时目录
rm -rf $BACKUP/$DATETIME
# 删除10天前的备份文件
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "==备份文件成功=="
crontab 设置定时任务
10 2 * * * /usr/sbin/mysql_db_backup.sh
.
相关文章:

Linux 之 shell 脚本
Linux 之 shell 脚本 1、脚本的格式要求2、shell 脚本常用执行方式2.1、绝对路径或相对路径方式2.2、sh脚本方式(不推荐) 3、shell 的变量3.1、定义 shell 变量3.2、将命令返回值赋值给变量 (重点)3.3、设置环境变量3.4、位置参数…...

如何去阅读开源的第三方库的源码
2023年9月2日,周六晚上 今天探索了一天如何去阅读第三方库的源码,终有所获。 再结合以前看cereal项目的源码的经验,于是就有了这篇博客。 我个人认为: 在阅读一个开源的第三方库之前,要先学会这个第三方库的一些简单…...

浅析Linux虚拟网络技术
文章目录 概述Tap/tun设备tun/tap的工作机制 Bridge网桥Bridge的工作机制Bridge IP 相关参考 概述 在传统的网络环境中,一台物理主机包含一张或多张网卡,要实现与其它物理主机之间的通信,需要将自身的网卡通过路由器或者交换机连接到外部的物…...

设计模式之九:迭代器与组合模式
有许多方法可以把对象堆起来成为一个集合(Collection),比如放入数组、堆栈或散列表中。若用户直接从这些数据结构中取出对象,则需要知道具体是存在什么数据结构中(如栈就用peek,数组[])。迭代器…...

官方推荐:6种Pandas读取Excel的方法
Pandas提供了多种读取Excel文件的方法,以下是官方推荐的6种方法: 1. 使用pd.read_excel()函数 这是最常用的方法,可以读取Excel文件,并将其转换为Pandas数据框。可以指定工作表名和列名的行号。 df pd.read_excel(data.xlsx, …...

Redis与Mysql区别
一、关系型数据库 mysql,pgsql,oracle ,sqlserver 支持连表关联查询(会有一些特定的语法特特性) 二、非关系型数据库 redis,mongodb,memcache (key-value) 三、关系型数据库与非关系型数据库的区别: 1&am…...

Black-Box Tuning for Language-Model-as-a-Service
本文是LLM系列的文章,针对《Black-Box Tuning for Language-Model-as-a-Service》的翻译。 语义模型即服务的黑盒调整 摘要1 引言2 背景3 方法4 实验5 讨论与未来工作 摘要 GPT-3等超大的预训练语言模型(PTM)通常作为服务发布。它允许用户设…...

通用的ARM64架构镜像
#此链接包含x86架构和ARM架构的pytorch镜像,镜像里面已下载好各种第三方库,GPU版本的pytorch可用。缺点:镜像有点大 测试环境:操作系统麒麟银河V10,ARM64处理器(cpu),显卡为T4显卡 …...

git大文件推送报错
报错信息 不多掰扯,直接上报错信息和截图 Delta compression using up to 8 threadsRPC failde; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large从以上的报错信息不难看出推送仓库的时候,请求体过大,为…...

RDMA性能优化经验浅谈
一、RDMA概述 首先我们介绍一下RDMA的一些核心概念,当然了,我并不打算写他的API以及调用方式,我们更多关注这些基础概念背后的硬件执行方式和原理,对于这些原理的理解是能够写出高性能RDMA程序的关键。 Memory Region RDMA的网…...

day 44 | ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费
309.最佳买卖股票时机含冷冻期 此外,在返回的时候,由于状态234都是卖出的状态,所以要比较其最大值进行返回。 func maxProfit(prices []int) int {dp : make([][]int, len(prices))dp[0] make([]int, 4)dp[0][0] -prices[0]for i : 1; i &…...

电子科大软件系统架构设计——系统分析与设计概述(含课堂作业、练习答案)
系统分析与设计概述 信息系统概述 what 信息系统是一种能够完成对业务数据进行采集、转换、加工、计算、分析、传输、维护等信息处理,并能就某个方面问题给用户提供信息服务的计算机应用系统。 组成 信息化基础设施(计算机、计算机网络、服务器、系统…...

【SpringMVC】@RequestMapping注解(详解)
文章目录 前言1、RequestMapping注解的功能2、RequestMapping注解的位置3、RequestMapping注解的value属性4、RequestMapping注解的method属性1、对于处理指定请求方式的控制器方法,SpringMVC中提供了RequestMapping的派生注解2、常用的请求方式有get,po…...

8.(Python数模)马尔科夫链预测
Python实现马尔科夫链预测 马尔科夫链原理 马尔科夫链是一种进行预测的方法,常用于系统未来时刻情况只和现在有关,而与过去无关。 用下面这个例子来讲述马尔科夫链。 如何预测下一时刻计算机发生故障的概率? 当前状态只存在0(故…...

什么是浏览器缓存(browser caching)?如何使用HTTP头来控制缓存?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浏览器缓存和HTTP头控制缓存⭐ HTTP头控制缓存1. Cache-Control2. Expires3. Last-Modified 和 If-Modified-Since4. ETag 和 If-None-Match ⭐ 缓存策略⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击…...

谁需要了解学习RPA?什么地方可以使用RPA?
RPA(Robotic Process Automation)是一种通过软件机器人自动化执行特定任务和流程的技术。以下是一些需要了解RPA的人群: 企业决策者:企业决策者需要了解RPA的潜在收益和风险,以及如何将其纳入企业的数字化转型战略中。…...

Qt各个版本下载及安装教程(离线和非离线安装)
Qt各个版本下载链接: Index of /archive/qthttps://download.qt.io/archive/qt/ 离线安装 ,离线安装很无脑,下一步下一步就可以。 我离线下载 半个小时把2G的exe下载下来了...

使用爬虫代码获得深度学习目标检测或者语义分割中的图片。
问题描述:目标检测或者图像分割需要大量的数据,如果手动从网上找的话会比较慢,这时候,我们可以从网上爬虫下来,然后自己筛选即可。 代码如下(不要忘记安装代码依赖的库): # -*- co…...

代码随想录算法训练营第39天 | ● 62.不同路径 ● 63. 不同路径II
文章目录 前言一、62.不同路径二、63.不同路径II总结 前言 动态规划 一、62.不同路径 深搜动态规划数论 深搜: 注意题目中说机器人每次只能向下或者向右移动一步,那么其实机器人走过的路径可以抽象为一棵二叉树,而叶子节点就是终点&#…...

《网站建设:从规划到发布的全过程详解》
一、引言 在数字时代,网站已经成为企业和个人在互联网上的重要存在。一个优质网站的建立需要周全的规划、设计、开发、测试和发布。本文将详细介绍网站建设的全过程,帮助读者了解和掌握网站建设的流程和方法。 二、网站建设的意义 网站建设具有以下意…...

1分钟实现 CLIP + Annoy + Gradio 文搜图+图搜图 系统
多模态图文搜索系统 CLIP 进行 Text 和 Image 的语义EmbeddingAnnoy 向量数据库实现树状结构索引来加速最近邻搜索Gradio 轻量级的机器学习 Web 前端搭建 文搜图 图搜图 CLIP图像语义提取功能!...

用树形dp+状压维护树上操作的计数问题:0902T3
发现操作数 k ≤ 6 k\le6 k≤6,可以考虑对操作进行状压。 然后找找性质,发现要么删掉一棵子树,要么进去该子树。可以视为每种操作有两种情况。 然后分讨一下当前该如何转移。 树形dp的顺序: 合并子树考虑当前往上的边的方向 …...

【python爬虫】批量识别pdf中的英文,自动翻译成中文上
不管是上学还是上班,有时不可避免需要看英文文章,特别是在写毕业论文的时候。比较头疼的是把专业性很强的英文pdf文章翻译成中文。我记得我上学的时候,是一段一段复制,或者碰到不认识的单词就百度翻译一下,非常耗费时间。本文提供批量识别pdf中英文的方法,后续文章实现自…...

Android笔记--Hilt
Hilt 是 Android 的依赖项注入库,可减少在项目中执行手动依赖项注入的样板代码。执行手动依赖项注入要求您手动构造每个类及其依赖项,并借助容器重复使用和管理依赖项。依赖注入的英文是Dependency Injection,简称DI,简单说一个类中使用的依赖…...

Oracle常用权限处理
对于Oracle来说,用户等于Schema,创建用户即创建Schema -- 创建用户 create user TCK_TEXT identified by "TCKTCK"; --赋予登陆权限 grant connect to TCK_TEXT; --查看权限列表 select * from user_role_privs ; select * from user_sys_priv…...

Stable Diffuse 之 本地环境部署 WebUI 进行汉化操作
Stable Diffuse 之 本地环境部署 WebUI 进行汉化操作 目录 Stable Diffuse 之 本地环境部署 WebUI 进行汉化操作 一、简单介绍 二、汉化操作 附录: 一、Install from URL 中出现 Failed to connect to 127.0.0.1 port 7890: Connection refused 错误…...

r 安装源码包 安装本地r包
总结一下手动安装R包 - 简书 (jianshu.com)https://www.jianshu.com/p/2a7a36414734 #BiocManager::install("simplifyEnrichment") #BiocManager::install("EnsDb.Hsapiens.v86")#下载包 之后 手动安装 #install.packages("~/datasets/EnsDb.Hsapien…...

webservice调用对接第三方系统
#webservice调用对接第三方系统# 最近接到一个任务,需要对接第三方数据,第三方提供对接方式的是通过webservice调用,webservice调用有好几种方式,具体可以自行了解,我选择的是通过wsdl文件自动生成客户端代码对接。 …...

实现不同局域网文件共享的解决方案:使用Python自带HTTP服务和端口映射
文章目录 1. 前言2. 本地文件服务器搭建2.1 python的安装和设置2.2 cpolar的安装和注册 3. 本地文件服务器的发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 数据共享作为和连接作为互联网的基础应用,不仅在商业和办公场景有广泛的应用…...

[Android 四大组件] --- Activity
1 Activity是什么 Activity是一个Android的应用组件,它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的窗口,窗口可以充满哦屏幕也可以小于屏幕并浮动在其他窗口之上。 一个应用通常是由多个彼此松散联系的Activity组成&…...