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.不同路径 深搜动态规划数论 深搜: 注意题目中说机器人每次只能向下或者向右移动一步,那么其实机器人走过的路径可以抽象为一棵二叉树,而叶子节点就是终点&#…...
《网站建设:从规划到发布的全过程详解》
一、引言 在数字时代,网站已经成为企业和个人在互联网上的重要存在。一个优质网站的建立需要周全的规划、设计、开发、测试和发布。本文将详细介绍网站建设的全过程,帮助读者了解和掌握网站建设的流程和方法。 二、网站建设的意义 网站建设具有以下意…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
在Spring Boot中集成RabbitMQ的完整指南
前言 在现代微服务架构中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...
