Linux复习笔记(六)shell编程
遇到的问题,都有解决方案,希望我的博客能为你提供一点帮助。
三、shell编程简明教程
一、Shell基础概念
1. Shell的作用
- 是用户与Linux内核交互的桥梁,既是命令解释器,也是一种脚本语言。
- 运行机制:用户输入命令或脚本 → Shell解析 → 调用内核服务 → 结果返回终端。
2. 脚本编写规范
- 文件扩展名:
.sh
- 框架结构:
#!/bin/bash # 指定解析器 # 注释用# # 注释 var="Hello World" # 变量定义 echo $var # 输出
示例1:Hello World脚本
#!/bin/bash
echo "Hello World!"
运行方式:
chmod +x hello.sh
./hello.sh
二、变量
1. 变量类型
- 环境变量:系统级全局变量(如
$PATH
,$HOME
)。 - 自定义变量:用户定义,分全局(
export var
)和局部。 - 特殊符号变量:如
$0
(脚本名)、$#
(参数个数)、$?
(上条命令状态)。
2. 变量操作
- 定义变量:
VAR=value
(等号无空格)。 - 使用变量:
echo $VAR
或${VAR}
。 - 只读变量:
readonly VAR
。
示例2:变量作用域
#!/bin/bash
var1="Global" # 父Shell变量
export var1 # 导出为全局变量
(var2="Local" # 子Shell变量echo "子Shell: var1=$var1, var2=$var2"
)
echo "父Shell: var1=$var1, var2=$var2" # var2不存在
输出:
子Shell: var1=Global, var2=Local
父Shell: var1=Global, var2=
三、运算符
1. 算术运算
- 使用
$(( ))
或expr
:result1=$(( (2+3)*4 )) # 输出20 result2=`expr 2 + 3` # expr需空格 result3=`expr $result2 \* 4` # 乘法需转义*
示例3:计算1+2+...+100
#!/bin/bash
sum=0
for ((i=1; i<=100; i++)); dosum=$((sum + i))
done
echo "Sum: $sum" # 输出5050
2. 关系与逻辑运算
- 关系运算符:
-eq
(等于)、-gt
(大于)。 - 逻辑运算符:
&&
(与)、||
(或)。
运算符 | 功能描述 | 示例(判断 a 和 b 的关系) |
---|---|---|
-eq | 等于(equal) | [ "$a" -eq "$b" ] 或 [[ $a -eq $b ]] |
-ne | 不等于(not equal) | [ "$a" -ne "$b" ] |
-gt | 大于(greater than) | [ "$a" -gt "$b" ] |
-ge | 大于等于(greater than or equal) | [ "$a" -ge "$b" ] |
-lt | 小于(less than) | [ "$a" -lt "$b" ] |
-le | 小于等于(less than or equal) | [ "$a" -le "$b" ] |
四、流程控制
基本语法
if [ condition ]; then# 条件为真时执行的代码
fi
条件表达式
[]
是传统的条件判断,适用于简单的条件测试。[[]]
是 Bash 的扩展条件判断,支持更复杂的逻辑和字符串操作(如正则表达式)。((...))
用于算术表达式,适合在if
语句中进行算术比较。
if [[ $var == "value" ]]; thenecho "变量 var 的值是 value"
fi
sum=10
if ((sum % 2 == 0)); thenecho "sum is even"
fi
比较运算符
Bash 中常用的比较运算符包括:
-
字符串比较:
==
,!=
-
数值比较:
-eq
,-ne
,-gt
,-lt
,-ge
,-le
-
文件测试:
-e
,-f
,-d
,-r
,-w
,-x
if [ $num -gt 10 ]; thenecho "数字大于 10"
fi
逻辑运算符
可以使用 &&
和 ||
来组合多个条件。
if [[ $var1 == "value1" && $var2 == "value2" ]]; thenecho "两个条件都满足"
fi
if-else 语句
if-else
语句允许在条件不满足时执行另一段代码。
if [ $var == "value" ]; thenecho "条件为真"
elseecho "条件为假"
fi
if-elif-else 语句
if-elif-else
语句用于处理多个条件。
if [ $var == "value1" ]; thenecho "变量等于 value1"
elif [ $var == "value2" ]; thenecho "变量等于 value2"
elseecho "变量既不等于 value1 也不等于 value2"
fi
嵌套 if 语句
if
语句可以嵌套使用,以处理更复杂的逻辑。
if [ $var1 == "value1" ]; thenif [ $var2 == "value2" ]; thenecho "两个条件都满足"fi
fi
使用 test 命令
test
命令也可以用于条件判断,通常与 if
语句一起使用。
#[]是test 简写
if test $var == "value"; thenecho "条件为真"
fi
字符串匹配
[[ ]]
支持正则表达式匹配,可以使用 =~
运算符。
if [[ $var =~ ^[0-9]+$ ]]; thenecho "变量只包含数字"
fi
文件测试
if
语句常用于检查文件或目录是否存在。
if [ -f /path/to/file ]; thenecho "文件存在"
fi
空值检查
可以使用 -z
检查变量是否为空。
if [ -z $var ]; thenecho "变量为空"
fi
使用 -n
检查变量是否非空。
if [ -n $var ]; thenecho "变量非空"
fi
多个条件的组合
可以通过 -a
和 -o
组合多个条件。
if [ $var1 == "value1" -a $var2 == "value2" ]; thenecho "两个条件都满足"
fi
使用 case 语句
对于多个条件的判断,case
语句可能更简洁。
case $var in"value1")echo "变量等于 value1";;"value2")echo "变量等于 value2";;*)echo "变量既不等于 value1 也不等于 value2";;
esac
示例4:判断分数是否及格
#!/bin/bash
if [ $1 -ge 60 ]; thenecho "及格"
elseecho "不及格"
fi
# 测试及格情况
./script.sh 75 # 输出:及格# 测试不及格情况
./script.sh 59 # 输出:不及格
示例5:根据参数输出星期
#!/bin/bash
case $1 in1) echo "周一";;2) echo "周二";;*) echo "Other";;
esac
运行:./script.sh 2
→ 输出周二
。
五、正则表达式
基本语法
.
:匹配任意单个字符,除了换行符。\d
:匹配任意数字,等价于[0-9]
。\D
:匹配任意非数字字符,等价于[^0-9]
。\w
:匹配任意字母、数字或下划线,等价于[a-zA-Z0-9_]
。\W
:匹配任意非字母、非数字、非下划线字符,等价于[^a-zA-Z0-9_]
。\s
:匹配任意空白字符,包括空格、制表符、换行符等。\S
:匹配任意非空白字符。^
:匹配字符串的开始。$
:匹配字符串的结束。*
:匹配前面的子表达式零次或多次。+
:匹配前面的子表达式一次或多次。?
:匹配前面的子表达式零次或一次。{n}
:匹配前面的子表达式恰好 n 次。{n,}
:匹配前面的子表达式至少 n 次。{n,m}
:匹配前面的子表达式至少 n 次,至多 m 次。[]
:匹配方括号中的任意一个字符。|
:表示“或”,匹配左边或右边的表达式。
基本元字符
^
:行首;$
:行尾;.*
:任意字符;[0-9]
:数字。grep
示例:grep "^root" /etc/passwd # 查找以root开头的行 grep "nologin$" /etc/passwd # 查找以nologin结尾的行
扩展正则表达式
+
:1次以上;?
:0或1次;|
:或。egrep
示例:egrep "(root|admin)" /etc/passwd # 匹配root或admin
grep+正则表达式用法:
grep "pattern" file.txt
该命令会在 file.txt
中搜索包含 pattern
的行。
正则表达式匹配
grep "^start" file.txt
该命令会匹配以 start
开头的行。
grep "end$" file.txt
该命令会匹配以 end
结尾的行。
匹配任意字符
grep "a.b" file.txt
该命令会匹配包含 a
后跟任意一个字符再跟 b
的行,例如 aab
、acb
等。
匹配多个字符
grep "[abc]" file.txt
该命令会匹配包含 a
、b
或 c
的行。
匹配重复字符
grep "a*" file.txt
该命令会匹配包含零个或多个 a
的行。
grep "a\+" file.txt
该命令会匹配包含一个或多个 a
的行。
匹配特定次数
grep "a\{2\}" file.txt
该命令会匹配包含恰好两个 a
的行。
grep "a\{2,\}" file.txt
该命令会匹配包含两个或更多 a
的行。
匹配单词边界
grep "\bword\b" file.txt
该命令会匹配包含完整单词 word
的行。
忽略大小写
grep -i "pattern" file.txt
该命令会忽略大小写,匹配 pattern
的行。
反向匹配
grep -v "pattern" file.txt
该命令会匹配不包含 pattern
的行。
递归搜索
grep -r "pattern" /path/to/directory
该命令会在指定目录及其目录中递归搜索包含 pattern
的文件。
显示匹配行号
grep -n "pattern" file.txt
该命令会显示匹配行的行号。
显示匹配文件名
grep -l "pattern" /path/to/directory
该命令会显示包含匹配内容的文件名。
使用扩展正则表达式
grep -E "pattern" file.txt
该命令会使用扩展正则表达式进行匹配,支持更多元字符和操作符。
示例
grep -E "^[A-Za-z]+$" file.txt
该命令会匹配仅包含字母的行。
grep -E "[0-9]{3}-[0-9]{2}-[0-9]{4}" file.txt
该命令会匹配类似 123-45-6789
格式的社会安全号码。
六、循环结构
1. for循环
示例6:遍历参数
#!/bin/bash
for arg in "$@"; doecho "参数: $arg"
done
"$@"
:双引号包裹的特殊变量,表示所有命令行参数,且保留参数中的空格
运行:./script.sh A B C
→ 输出三个参数。
2. while循环
示例7:求1~n的和
#!/bin/bash
sum=0
i=1
while [ $i -le $1 ]; dosum=$((sum + i))i=$((i + 1))
done
echo "Sum: $sum"
运行:./script.sh 100
→ 输出5050。
3.数组遍历
通过元素遍历:
arr=("apple" "banana" "cherry")
for fruit in "${arr[@]}"
doecho "$fruit"
done
通过索引遍历:
arr=("red" "green" "blue")
for index in "${!arr[@]}"
doecho "元素 $index 是 ${arr[$index]}"
done
注意要点:
- 数组声明使用
()
包裹元素,元素间用空格分隔 ${arr[@]}
获取所有数组元素${!arr[@]}
获取所有数组索引- 双引号
"
可防止带空格的元素被拆分 - 索引从0开始计数
示例输出:
apple
banana
cherry
元素 0 是 red
元素 1 是 green
元素 2 是 blue
七、输入输出
1. echo格式化输出
echo -e "\e[1;31m红色文字\e[0m" # 红色文字
printf "%-10s %5d\n" "Tom" 90 # 对齐输出
2. read交互输入
read -p "请输入用户名: " user
read -s -t 10 -p "密码(10秒内): " pass
echo "用户: $user, 密码: $pass"
八、文件判断
示例8:检查文件属性
#!/bin/bash
if [ -e "$1" ]; thenecho "文件存在"[ -r "$1" ] && echo "可读"
elseecho "文件不存在"
fi
运行:./script.sh test.txt
→ 检查文件状态。
九、综合案例
示例9:系统信息菜单
#!/bin/bash
clear
echo -e "\e[1;34m系统信息菜单\e[0m"
echo "1. 查看网卡信息"
echo "2. 查看内存信息"
read -p "输入选项[1-2]: " choice
case $choice in1) ifconfig | head -2;;2) free -h | grep Mem;;*) echo "无效选项";;
esac
[ -r "$1" ] && echo "可读"
:
-r
:文件可读测试(r
eadable)。&&
:逻辑与运算符,当前面的命令成功(返回状态码 0)时才执行后面的命令。
示例10: 遍历和统计 /etc/ftp下的文件/目录数
文件测试操作符
在Shell脚本中,通过 -d
和 -f
可以判断文件类型:
-
-d <file>
:判断是否为目录文件。 -
-f <file>
:判断是否为普通文件(如文本、二进制文件)。
#!/bin/bash
#记录文件和目录的数量
f_count=0
d_count=0
#遍历/etc/ftp/下所有文件
for file in /etc/ftp/*; doif [ -d "$file"]; then((d_count++))elif [ -f "$file" ]; then((f_count++))fi
done#输出
echo "文件数:$f_count”
echo "目录数:$d_count"
chmod +x count_files.sh
./count_files.sh
# 输出示例:
# 目录文件数量: 3
# 普通文件数量: 8
示例11:读取文件并操作 users.txt
users.txt
#!/bin/bash
count=0
while IFS= read -r line;do((count++))#读取账户(奇数行)密码(偶数行)if ((count%2==0));thenu_passwd="$line"#判断账户是否存在if id "$ u_name";thenecho "用户 $username 已存在,正在修改密码..."echo "$username:$password" | chpasswdelseecho "用户 $username 不存在,正在创建账户和密码..."useradd "$u_name"echo "$username:$password" | chpasswdfielseu_name="$line"fi
done < users.txt
示例12: 判断服务类型以及对服务进行操作
#!/bin/bash
#服务数组
service=("htp","http","vsftpd")
for i in "{service[@]}"; doif systemctl is-active --quiet "$i";thenecho "[OK] $i服务已运行"elseecho "[修复] $i 服务未启动,正在尝试启动..."sudo systemctl start "$i"sudo systemctl enable "$i" # 可选:设置开机自启fi
done
相关文章:

Linux复习笔记(六)shell编程
遇到的问题,都有解决方案,希望我的博客能为你提供一点帮助。 三、shell编程简明教程 一、Shell基础概念 1. Shell的作用 是用户与Linux内核交互的桥梁,既是命令解释器,也是一种脚本语言。运行机制:用户输入…...

Unity 拖尾烟尘效果及参数展示
亮点:在移动特效过后 ,粒子会顺着惯性继续向前移动一小段距离。 以unity-URP管线为例,下图是Particle System参数分享: Start Color参数: UnityEditor.GradientWrapperJSON:{"gradient":{"serialized…...

Vue3 Echarts 3D饼图(3D环形图)实现讲解附带源码
文章目录 前言一、准备工作1. 所需工具2. 引入依赖方式一:CDN 快速引入方式二:npm 本地安装(推荐) 二、实现原理解析三、echarts-gl 3D插件 使用回顾grid3D 常用通用属性:series 常用通用属性:surface&…...

Kafka快速安装与使用
引言 这篇文章是一篇Ubuntu(Linux)环境下的Kafka安装与使用教程,通过本文,你可以非常快速搭建一个kafka的小单元进行日常开发与调测。 安装步骤 下载与解压安装 首先我们需要下载一下Kafka,这里笔者采用wget指令: wget https:…...

Java EE初阶——wait 和 notify
1. 线程饥饿 线程饥饿是指一个或多个线程因长期无法获取所需资源(如锁,CPU时间等)而持续处于等待状态,导致其任务无法推进的现象。 典型场景 优先级抢占: 在支持线程优先级的系统中,高优先级线程可能持续…...

RPA vs. 传统浏览器自动化:效率与灵活性的终极较量
1. 引言 在数字化转型的大潮下,企业和开发者对浏览器自动化的需求日益增长。无论是网页数据抓取、自动化测试,还是用户行为模拟,浏览器自动化已经成为提升效率的关键工具。然而,面对越来越严格的反自动化检测、复杂的 Web 结构和…...
Flask框架深度解析:蓝图、上下文机制与Jinja2模板引擎实战
Flask作为Python最流行的轻量级Web框架之一,以其简洁、灵活和高度可扩展的特性赢得了广大开发者的青睐。本文将深入探讨Flask框架的三大核心特性:蓝图(Blueprint)模块化开发、上下文(Context)管理机制以及Jinja2模板引擎的高级用法。无论你是Flask初学者…...

docker 快速部署若依项目
1、首先创建一个自定义网络,作用是使连接到该网络的容器能够通过容器名称进行通信,无需使用复杂的IP地址配置,方便了容器化应用中各个服务之间的交互。 sudo docker network create ruoyi 2、创建一个文件夹,创建compose.yml文件…...

polarctf-web-[rce1]
考点: (1)RCE(exec函数) (2)空格绕过 (3)执行函数(exec函数) (4)闭合(ping命令闭合) 题目来源:Polarctf-web-[rce1] 解题: 这段代码实现了一个简单的 Ping 测试工具,用户可以通过表单提交一个 IP 地址,服务器会执…...
数据备份与恢复方案
数据备份与恢复方案 一.背景 为确保公司信息安全,防止关键数据丢失,应对突发事件,特制定全面的数据备份与恢复方案。该方案将对公司的各类文件资料进行分级管理,并针对不同级别的数据设定相应的备份策略和恢复流程。 二…...

Redis+Caffeine构造多级缓存
一、背景 项目中对性能要求极高,因此使用多级缓存,最终方案决定是RedisCaffeine。其中Redis作为二级缓存,Caffeine作为一级本地缓存。 二、Caffeine简单介绍 Caffeine是一款基于Java 8的高性能、灵活的本地缓存库。它提供了近乎最佳的命中…...

docker(四)使用篇二:docker 镜像
在上一章中,我们介绍了 docker 镜像仓库,本文就来介绍 docker 镜像。 一、什么是镜像 docker 镜像本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。 我们可以把…...
ms-swift 代码推理数据集
目前想要对SFT微调后的模型进行测试,看官方文档ms-swift中有eval的教程,但是从介绍来看,eval使用的是modelscope的评测内容。 评测 SWIFT支持了eval(评测)能力,用于对原始模型和训练后的模型给出标准化…...

AXI4总线协议 ------ AXI_LITE协议
一、AXI 相关知识介绍 https://download.csdn.net/download/mvpkuku/90841873 AXI_LITE 选出部分重点,详细文档见上面链接。 1.AXI4 协议类型 2.握手机制 二、AXI_LITE 协议的实现 1. AXI_LITE 通道及各通道端口功能介绍 2.实现思路及框架 2.1 总体框架 2.2 …...
DATE_FORMAT可以接收date类型,也可以接收String类型!
DATE_FORMAT 是 SQL 函数,主要用于将日期/时间类型的字段按照指定格式转换成字符串。在 MyBatis 的 XML 动态 SQL 中,你看到的这段代码是为了比较数据库中的日期字段和传入参数的日期值,但会忽略时间部分,只比较年月日。 代码解释…...

Ubuntu24.04 安装 5080显卡驱动以及cuda
前言 之前使用Ubuntu22.04版本一直报错,然后换了24.04版本才能正常安装 一. 配置基础环境 Linux系统进行环境开发环境配置-CSDN博客 二. 安装显卡驱动 1.安装驱动 按以下步骤来: sudo apt update && sudo apt upgrade -y#下载最新内核并安装 sudo add…...
华三H3C交换机配置NTP时钟步骤 示例
现场1台H3C 5110交换机 版本:Comware Software, Version 5.20.99, Release 1105 当前没有指定NTP, <H3C-5110>dis ntp-service status Clock status: unsynchronizedClock stratum: 16Reference clock ID: noneNominal frequency: 100.0000 HzAc…...
RKNN开发环境搭建(ubuntu22.04)
以下情况在RV1106G3的平台上验证正常。 1、conda安装 1)conda --version//确认是否安装 2)创建一个安装目录,进行下一步 3)wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-4.6.14-Linux-x…...
matlab多项式
1. 多项式表示 多项式用行向量表示,按降幂排列系数。例如,多项式 3x22x1 表示为 [3 2 1]。 2. 创建多项式 直接输入系数:如 p [1 -3 3 -1] 表示 x3−3x23x−1。由根创建:使用 poly 函数。例如,根为 [1, 1, 1]&…...
Sprnig MVC 如何统一异常处理 (Exception Handling)?
主要有以下几种方式来实现统一异常处理,其中 ControllerAdvice (或 RestControllerAdvice) 结合 ExceptionHandler 是最常用的方式。 1. ExceptionHandler 注解 作用: 用于标记一个方法,该方法将处理在同一个 Controller 类中抛出的特定类型…...

SpringAI-RC1正式发布:移除千帆大模型!
续 Spring AI M8 版本之后(5.1 发布),前几日 Spring AI 悄悄的发布了最新版 Spring AI 1.0.0 RC1(5.13 发布),此版本也将是 GA(Generally Available,正式版)发布前的最后…...

操作系统之进程和线程听课笔记
计算机的上电运行就是构建进程树,进程调度就是在进程树节点进程进行切换 进程间通信的好处 经典模型 生产者和消费者 进程和线程的区别 线程引入带来的问题线程的优势 由于unix70年代产生,90年代有线程,当时数据库系统操作需要线程,操作系统没有来得及重造,出现了用户态线…...
【vue】封装接口,全局字典,表格表头及使用
一、封装接口(API请求) 1. 创建axios实例 // src/utils/request.js import axios from axiosconst service axios.create({baseURL: process.env.VUE_APP_BASE_API,timeout: 10000 })// 请求拦截器 service.interceptors.request.use(config > {co…...
深入解析ZAB协议:ZooKeeper的分布式一致性核心
引言 在分布式系统中,如何高效、可靠地实现多节点间的数据一致性是核心挑战之一。ZAB协议(ZooKeeper Atomic Broadcast)作为 ZooKeeper的核心算法,被广泛应用于分布式协调服务(如Kafka、HBase、Dubbo等)。…...

COMSOL随机参数化表面流体流动模拟
基于粗糙度表面的裂隙流研究对于理解地下水的流动、污染物传输以及与之相关的地质灾害(如滑坡)等方面具有重要意义。本研究通过蒙特卡洛方法生成随机表面形貌,并利用COMSOL Multiphysics对随机参数化表面的微尺度流体流动进行模拟。 参数化…...
大模型笔记-“训练”和“推理”概念
在大模型(如Transformer类模型、LLM)的资源管理和开发流程中,“训练”和“推理”是两个核心概念,分别对应模型的构建和实际应用阶段: 训练是模型的“学习过程”,需要大量资源和时间。推理是模型的“应用过…...

JavaSwing中的容器之--JScrollPane
JavaSwing中的容器之–JScrollPane 在Java Swing中,容器是用于容纳其他组件(如按钮、标签等)的组件。Swing提供了多种容器,它们可以嵌套使用以创建复杂的用户界面。 JScrollPane是一个轻量级组件,提供可滚动视图。JSc…...

使用 Cookie 实现认证跳转功能
使用 Cookie 实现认证跳转功能的实践与解析 在 Web 开发中,用户身份认证是一个基础而关键的功能点。本文将通过一个简单的前后端示例系统,介绍如何基于 Cookie 实现 Token 保存与自动跳转认证的功能,并结合 Cookie 与 Header 的区别、使用场…...
Reth(冗余以太网接口) 和Bridge-Aggregation(链路聚合接口)区别
Reth(Redundant Ethernet)与Bridge-Aggregation是H3C设备中两种不同的接口技术,主要区别体现在工作原理、应用场景及配置特性上。以下是详细对比分析: 定义与类型 Reth(冗余以太网接口) 类型:…...
(面试)Android各版本新特性
Android 6.0 (Marshmallow, API 23) 运行时权限管理:用户可在应用运行时动态授予或拒绝权限,取代安装时统一授权4。Doze模式与应用待机:优化后台耗电,延长设备续航5。指纹识别支持:原生API支持指纹身份验证。 Android…...