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 |…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
