Linux/C 高级——shell脚本
1. shell脚本基础概念
1.1概念
shell使用方式:手动下命令和脚本脚本本质是一个文件,文件里面存放的是特定格式的指令,系统可以使用脚本解析器翻译或解析指令并执行(它不需要编译)。
shell脚本本质:shell命令的有序集合,扩展名可以为sh见名知意,也可以没有。
shell 既是应用程序,又是一种脚本语言(应用程序 解析 脚本语言)。
编译型语句:编译器gcc, g++
解释型语句:不需要编译,解释一条执行一条,python、shell脚本。
1.2创建和执行
新建一个shell脚本: touch xx.sh
第一行为: #!/bin/bash
意思是使用/bin/bash来解释执行
执行方式:
- sudo chmod 权限 xx.sh #使脚本具有执行权限
- ./xx.sh #执行脚本

练习:
1)在当前路径下创建file_1到file_5, 5个普通文件
2)删除 file_2和file_3文件(使用通配符)
3)将剩下的file文件用tar压缩成bz2的格式
4)将压缩文件复制到家目录下
5)进入到家目录解压压缩文件
6)删除压缩包

2.变量
2.1用户自定义变量
名命一般用大写
进行赋值时用=,左右两边不能有空格
引用变量在变量名前面加$
2.2位置变量
$0或者${0}代表包含脚本文件名的命令行参数./xx.sh
$1,$2...代表第二个命令行参数、第三个命令行参数以此类推
$# 代表命令行参数个数(不包含第一个也就是带脚本名的命令行参数)
$@或者$* 代表所有命令行参数(不包含第一个也就是带脚本名的命令行参数)

2.3预定义变量
$? 代表前一个命令的退出状态(0为真,非0为假)$$ 代表执行进程的ID号
2.4环境变量
变量没有类型,都看作是字符串。环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
HOME: /etc/passwd文件中列出的用户主目录
PATH :shell搜索路径,就是是一系列目录,当执行命令时,linux就在这些目录下查找。
3.功能语句
3.1说明性语句
以#开头注释用#
3.2功能性语句
3.2.1 read
功能:read从标准输入读入一行,并赋值给后面的变量
格式:read 变量列表
把读入行中的第一个单词赋值给第一个变量,第二个单词赋值给第二个变量以此类推
read -p "提示语句" 变量列表: 可以将提示语句输出,同时输入变量

3.2.2 expr
expr 表达式
注意:表达式符号之间必须有空格,元素引用用$
可以直接输出结果,不过脚本里一般结合命令置换符把结果重新赋值给其他变量
算术运算符命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和取余数(%)等操作。注意小圆括号()前面也要加转义符\。
例子:

练习1:通过expr实现变量自加运算(++i)
练习2:计算表达式值a*b+c-d/b,a=2,b=3,c=15,d=18
要求:
1)从终端读入4个数a,b,c,d
2)进行运算
3)打印结果输出到终端
#!/bin/bashI=0
#I=`expr $I + 1`
((++I ))
echo $Iread -p "input: " a b c d
#NUM=`expr $a \* $b + $c - $d / $b`
((NUM=a*b+c-d/b))
#NUM=$((a*b+c-d/b))
echo $NUM 也可以用(())进行数学运算
3.2.3 let
let 表达式

3.2.4 test
可测试对象三种:字符串 整数 文件属性
每种测试对象都有若干测试操作符
1)字符串的测试:
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0
2)整数的测试:
a -eq b 测试a 与b 是否相等 equal
a -ne b 测试a 与b 是否不相等 not equal
a -gt b 测试a 是否大于b greater than
a -ge b 测试a 是否大于等于b greater equal
a -lt b 测试a 是否小于b litter than
a -le b 测试a 是否小于等于b litter equal
3)文件属性的测试:
-d name 测试name 是否为一个目录
-f name 测试name 是否为普通文件
-e name 测试文件是否存在
#!/bin/bash#测试字符串
VAR="hello"
test $VAR = "hello"
echo $?test $VAR != "hello"
echo $?test -z $VAR
echo $?test -n $VAR
echo $?#测试整数
test 10 -eq 5
echo $?test 10 -ne 5
echo $?test 10 -gt 5
echo $?test 10 -lt 5
echo $?#测试文件属性
read -p "input filename: " FILE
test -e $FILE
echo $?test -f $FILE
echo $?test -d $FILE
echo $? 3.3结构性语句
3.3.1 if语句
基本结构:
if 条件then
命令表1else
命令表2fi 多路分支结构:
if 条件1
then
命令表1
elif 条件2
then
命令表2
fi 嵌套结构:
if 条件1
thenif 条件2then
命令表1fi
else
命令表2
fi 例子:

补充操作符:
-o 或运算 例如 [ $a -lt 20 -o $b -gt 100 ] 返回 true
-a 与运算 例如 [ $a -lt 20 -a $b -gt 100 ] 返回 false
! 非运算 例如 [ ! false ] 返回 true
&& 逻辑与 例如 [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true
| 位或 例如 echo $[2|2]
&位与 例如 echo $[2&1]
3.3.2 case语句
格式:
case 变量 in
模式1)
命令表1;;
模式2)
命令表2;;
*)
命令表n;;
esac 例子:

练习:学生成绩管理系统,用shell中的case实现
90-100:A
80-89:B
70-79:C
60-69:D
<60:不及格
#!/bin/bashread -p "input score: " SCORE
case $SCORE in
100|9[0-9])echo "A";;
8[0-9])echo "B";;
7[0-9])echo "C";;
6[0-9])echo "D";;
[0-9]|[1-5][0-9])echo "lost";;
*)echo "input err";;
esac
3.3.3 for循环
格式:
for 变量名 in 单词表
do
命令表
done 变量依次取单词表中的各个单词, 每取一次单词, 就执行一次循环体中的命令。循环次数由单词表中的单词数确定。命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。
例子:

for语句的几种书写格式:
1)for i in 1 2 3 4 do....done :
变量i从单词表中取值
2)for i do...done:
变量i从命令行取值,可以省略in单词表
3)for i in {1..10} do...done:
变量i从1-10个数中取值
4)for ((i = 0; i < 10; i++)) do...done:
书写格式类似c语言

3.3.4 while
格式
while 命令或表达式
do
命令表
done while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。

练习:分别用for和while实现1-10求和
#!/bin/bashi=1
SUM=0
while test $i -le 10
do#((SUM=SUM+i))#SUM=`expr $SUM + $i`let SUM=SUM+i((i++))
done
echo $SUMSUM=0
##################################
for ((i=1;i<=10;i++))
do((SUM=SUM+i))
done
echo $SUM
3.3.5 循环控制语句
break n: 结束n层循环
continu n: 结束n层的本次循环,继续下一次循环
#!/bin/bashfor ((i=0;i<5;i++))
dofor((j=0;j<5;j++))doif [ $j -eq 3 ]then #break 1#break 2#continue 1continue 2fi echo "$i : $j" #4 2done
done
4.数组
4.1数组的赋值
a. 直接对数组赋值:arr=(1 2 3 4 5)
b. 把命令行参数赋值给数组:
arr=($1 $2 $3)
c. 把元素赋值给数组:
read a b c
arr=($a $b $c)
d. 给数组元素输入赋值:
read -a arr
4.2数组的调用
${arr[i]} #访问数组元素,数组下标从0开始到n-1结束
arr[i]=10 #对数组元素重新赋值
${arr[@]} #遍历数组
${#arr[@]} #表示数组元素的个数

练习:从终端输入3个整数,输出三个数中的最小值
#!/bin/bashread -a arr
MIN=${arr[0]}
n=${#arr[@]}
for ((i=0;i<n;i++))
doif [ $MIN -gt ${arr[i]} ]thenMIN=${arr[i]}fi
done
echo $MIN
冒泡排序:

练习:用shell脚本试下以下功能:
判断当前路径下是否存在目录aa,如果不存在创建;遍历当前路径下的文件,如果是普通文件,将文件复制到aa目录下,并计算文件的个数。
#!/bin/bashif [ -d aa ] #如果当前目录下有aa目录就删除然后创建
thenrm -r aa
fimkdir aanum=0
filelist=`ls` #将当前目录下所有文件赋值给filelist变量
for file in $filelist #for file in * #用file遍历当前目录下所有文件
doif [ -f $file ] #如果是普通文件就复制到aa目录下thencp $file ./aa ((num++)) #计算文件个数fi
done
echo $num
相关文章:
Linux/C 高级——shell脚本
1. shell脚本基础概念 1.1概念 shell使用方式:手动下命令和脚本 脚本本质是一个文件,文件里面存放的是特定格式的指令,系统可以使用脚本解析器翻译或解析指令并执行(它不需要编译)。 shell脚本本质:shell命…...
SpringBoot面试题整理(1)
面试整理 前置知识 ApplicationContextInitializerApplicationListenerBeanFactoryBeanDefinitionBeanFactoryPostProcessorAwareInitializingBean/DisposableBeanBeanPostProcessor 面试题 SpringBoot启动流程IOC容器初始化流程Bean声明周期Bean循环依赖SpringMVC执行流程…...
LVS原理及实例
目录 LVS原理 LVS概念 lvs集群的类型 lvs-nat 解释 传输过程 lvs-dr 解释 传输过程 特点 lvs-tun LVS(Linux Virtual Server)常见的调度算法 防火墙标记(Firewall Marking)结合轮询调度 实战案例 lvs的nat模式配置 …...
Spring统一功能处理:拦截器、响应与异常的统一管理
目录 一.拦截器 二.统一数据返回格式 三.统一异常处理 一.拦截器 拦截器是Spring框架提供的核⼼功能之⼀,主要⽤来拦截⽤⼾的请求,在指定⽅法前后,根据业务需要执⾏预先设定的代码。 也就是说,允许开发⼈员提前预定义⼀些逻辑…...
深入理解小程序的渲染机制与性能优化策略
一、小程序的渲染机制 小程序的渲染机制主要由两部分组成:渲染层和逻辑层。渲染层负责页面的渲染,逻辑层负责处理业务逻辑和数据处理。两者通过一个安全的、高效的通信机制进行数据传输和事件通知。 渲染层:在渲染层,WXML 模板会…...
Linux:多线程(二.理解pthread_t、线程互斥与同步、基于阻塞队列的生产消费模型)
上次讲解了多线程第一部分:Linux:多线程(一.Linux线程概念、线程控制——创建、等待、退出、分离,封装一下线程) 文章目录 1.理解Linux下线程——理解tid2. Linux线程互斥2.1相关概念2.2引入问题分析问题解决思路 2.3L…...
Pandas中`str`对象解析与应用实例
在数据科学领域,字符串操作是数据清洗和处理中不可或缺的一部分。Pandas的str对象为我们提供了一个强大而灵活的字符串操作方法集。本文将深入探讨str对象的各种应用,并通过代码示例和输出展示如何有效地处理字符串数据。 关键词 Pandas, 字符串操作, …...
C语言典型例题29
《C程序设计教程(第四版)——谭浩强》 习题2.6 设圆半径r1.5,圆柱高h3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。 scanf输入结果,输出计算结果,输出时要有文字说明,取小数点后两位数…...
Docker 常规安装简介
Docker常规安装简介 欢迎关注我的B站:https://space.bilibili.com/379384819 1. 安装mysql 1.1 docker hub上面查找mysql镜像 网址: https://hub.docker.com/_/mysql 1.2 从docker hub上(阿里云加速器)拉取mysql镜像到本地标…...
理解张量拼接(torch.cat)
拼接 维度顺序:对于 3D 张量,通常可以理解为 (深度, 行, 列) 或 (批次, 行, 列)。 选择一个dim进行拼接的时候其他两个维度大小要相等 对于三维张量,理解 torch.cat 的 dim 参数确实变得更加抽象,但原理是相同的。让我们通过一…...
指针基础知识(笔记)
文章目录 1. 概念理解2. 空指针和野指针3. 计算4. 小结5. size_t6. 案例一: 指针查找并返回指定元素索引7. 指针访问多维数组(涉及 int (*ptr)[3]解析)8. 指针数组9. 函数的值传递与地址引用传递① 函数的值传递(pass by value)② 地址传递(pass by reference) 10. 案例二&…...
[Python学习日记-3] 编程前选择一个好用的编程工具
[Python学习日记-3] 编程前选择一个好用的编程工具 简介 PyCharm IDE的安装 PyCharm IDE安装后的一些常规使用 简介 在踏上 Python 编程的精彩旅程之前,选择一款得心应手的编程工具无疑是至关重要的一步。这就如同战士在出征前精心挑选趁手的武器,它将…...
智能化的Facebook未来:AI如何重塑社交网络的面貌?
随着人工智能(AI)技术的飞速发展,社交网络的面貌正在经历深刻的变革。Facebook(现Meta Platforms)作为全球最大的社交媒体平台之一,正积极探索如何利用AI技术来提升用户体验、优化内容管理并推动平台创新。…...
安全启动的原理
安全启动(Secure Boot)是一种用于确保设备只运行经过认证的软件的安全机制。其核心原理和步骤如下: 1. **硬件信任根(Root of Trust, RoT)**: - 安全启动过程始于硬件信任根,通常是设备上的…...
【ML】pre-train model 是什么如何微调它,如何预训练
【ML】pre-train model 是什么如何微调它,如何预训练 0. 预训练模型(Pre-trained Model)0.1 预训练模型的预训练过程0.2 如何微调预训练模型0.3 总结 1. Contextualized word Embedding2. 怎么 让 bert 模型变小3. 如何微调模型 0. 预训练模型…...
leetcode代码练习——Java的数据结构(具体使用)
注:Java中所有的泛型必须是引用类型 如<Integer>而不是<int> java提供的数学方法: 求最大值Math.max(10,15),最小值Math.min(10,15) 看取值范围: int范围:-2^31-2^31-1 double范围:-2^63-2^63-1 long范围:-2^63-2…...
sqlserver导出数据脚本
文章目录 sqlserver导出数据脚本任务-生成脚本 sqlserver导出数据脚本 任务-生成脚本...
html+css 实现hover中间展开背景
前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目…...
Java 怎么获取支付宝Open ID
在Java中获取支付宝用户的OpenID,通常是通过支付宝的开放平台API来完成的。OpenID是支付宝用于唯一标识一个支付宝用户的字符串,它在OAuth授权流程中被用来获取用户的身份和权限。 下面我将给出一个基于Java使用Spring Boot框架和支付宝开放平台SDK来获…...
Web-server日志分析命令
https://gist.github.com/hvelarde/ceac345c662429447959625e6feb2b47 通过状态码获取请求总数 awk {print $9} /var/log/apache2/access.log | sort | uniq -c | sort –rn按照IP的请求数量排序 awk {print $1} /var/log/apache2/access.log | sort | uniq -c | sort -rn |…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
