【Shell脚本】Shell编程之数组
目录
一.数组
1.基本概念
2.定义数组的方法
2.1.方法一
2.2.方法二
2.3.方法三
2.4.方法四
2.5.查看数组长度
2.6.查看数组元素下标
3.数组分片
4.数组字符替换
4.1.临时替换
4.2.永久替换
5.数组删除
5.1.删除某个下标
5.2.删除整组
6.数组遍历和重新定义
7.数组追加元素
7.1.方法一
7.2.方法二
7.3.方法三
7.4.方法四
8.用函数判断数组是否完整
9.向函数传数组参数
10.从函数返回数组
10.1.实操
二.数组排序算法(拓展)
1.冒泡排序
1.1.概述
1.2.基本思想
1.3.算法思路
1.4.实操
2.直接选择排序
2.1.概述
2.2.基本思想
2.3.相关实操
3.反转排序
3.1.概述
3.2.基本思想
3.3.实操
一.数组
1.基本概念
- 数组(Array)是有序的元素序列
- 若将有限个类型相同的变量的集合命名,那么这个名称为数组名
- 组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量
- 用于区分数组的各个元素的数字编号称为下标
- 数组是在编程中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式
2.定义数组的方法
2.1.方法一
数组名=(value0 value1 value2 ...)
2.2.方法二
数组名=([0]=value [1]=value [2]=value ...)
2.3.方法三
列表名="value0 value1 value2 ..."数组名=($列表名)
2.4.方法四
数组名 [0]="value"数组名 [1]="value"数组名 [2]="value"
2.5.查看数组长度
echo ${#数组名[@]}echo ${#数组名[*]}
2.6.查看数组元素下标
echo ${!数组名[@]}echo ${!数组名[*]}
3.数组分片
echo ${数组名[@]:下标:长度}echo ${数组名[*]:下标:长度}
4.数组字符替换
echo ${数组名[@]/旧字符/新字符}数组名=(${数组名[*]/旧字符/新字符}) 通过重新定义的方式实现永久替换
4.1.临时替换
4.2.永久替换
5.数组删除
unset 数组名[下标] 删除数组的某个下标unset 数组名 删除数组
5.1.删除某个下标
5.2.删除整组
6.数组遍历和重新定义
arr=(1 2 3 4 5)
n=0
for i in ${arr[@]}
doarr[$n]=$[i*2]let n++
done
7.数组追加元素
7.1.方法一
数组名[新下标]=新元素
7.2.方法二
数组名[数组长度]=新元素 仅适用于完整的数组
7.3.方法三
数组名+=(新元素1 新元素2 ....)
7.4.方法四
数组名=("${数组名[@]}" 新元素1 新元素2 ....)
8.用函数判断数组是否完整
#!/bin/bash
#判断一个数组是否完整
array1=(10 20 30 40 50 60)
array3=([0]="a" [1]="b" [2]="c" [3]="d" [5]="f")#获取数组长度
length1=${#array1[@]}
length3=${#array3[@]}#获取长度n - 1 的下标
last1=$[length1 - 1]
last3=$[length3 - 1]#获取数组最后一个元素下标
last1_num=$(echo ${!array1[@]} | awk '{print $NF}')
last3_num=$(echo ${!array3[@]} | awk '{print $NF}')#判断长度n - 1 的下标 是否与 数组最后一个元素下标 相同
if [ $last1 -eq $last1_num ];thenecho "array1 数组完整"
elseecho "array1 数组不完整"
fiif [ $last3 -eq $last3_num ];thenecho "array3 数组完整"
elseecho "array3 数组不完整"
fi
9.向函数传数组参数
函数名() {数组2=($@) #在函数体内将传入的列表重新组成数组....
}函数名 ${数组1[@]} #在函数体外将数组分解成列表传入
10.从函数返回数组
函数名(){....echo ${数组2[@]} #在函数体内以列表形式返回值
}数组1=(函数名 参数) #在函数体外将函数执行的结果重新组合成数组
10.1.实操
#!/bin/bash
test1() {#在函数里将传入的元素列表重新组成数组arr2=($@)#遍历数组方法一for ((i=0; i<${#arr2[@]}; i++))doarr2[$i]=$[${arr2[$i]} *2]done#从函数返回数组echo ${arr2[@]}#遍历数组方法二#n=0#for i in ${arr2[@]}# arr2[$n]=$[$i * 2]# let n++# done
}arr1=(50 40 30 20 10)
# 向函数传入数组
result=$(test1 ${arr1[@]})#在函数体外将函数返回的值列表重新组成数组
arr1=($result)echo "arr double以后的值为 ${arr1[@]}"
二.数组排序算法(拓展)
1.冒泡排序
1.1.概述
类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动
1.2.基本思想
冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到
数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡
一样从底部上升到顶部
1.3.算法思路
冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因
为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用
于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少
1.4.实操
[root@localhost day14]# vim demo4.sh
[root@localhost day14]# bash demo4.sh
原始数组的顺序为 63 4 24 1 3 15
排序后数组顺序为 63 24 15 4 3 1
#!/bin/bash
#冒号排序算法arr=(63 4 24 1 3 15)
echo "原始数组的顺序为 ${arr[@]}"#获取数组长度
length=${#arr[@]}#外循环确定比较轮数,比较论述为数组长度 - 1
for ((a=1; a<length; a++))
do#内循环来比较相邻两个元素,从小到大排序;较大的往后放,每轮的比较次数随着轮数增加而减少for ((b=0; b<length-a; b++))do#获取左边比较元素的值left=${arr[$b]}#获取右边比较元素的值c=$[b + 1]right=${arr[$c]}#比较相邻两个元素,如果左边的元素值大于右边的,则元素互换if [ $left -lt $right ];thentmp=$left#将原来右边元素的值定义到左边元素arr[$b]=$right#将原来左边元素的值定义到右边元素arr[$c]=$tmpfidone
doneecho "排序后数组顺序为 ${arr[@]}
2.直接选择排序
2.1.概述
与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些
2.2.基本思想
将指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,
不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始序),
这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式
2.3.相关实操
[root@localhost day14]# vim demo5.sh
[root@localhost day14]# bash demo5.sh
原始数组的顺序为 63 4 24 1 3 15
排序后的数组顺序为 1 3 4 15 24 63
#!/bin/bash
#直接选择排序arr=(63 4 24 1 3 15)
echo "原始数组的顺序为 ${arr[@]}"length=${#arr[@]}
#外循环 确定排序轮数,轮数为数组长度 - 1
for ((a=1; a<length; a++))
do#定义初始最大元素的下标为0max=0#内循环 确定当前比较轮数最大的元素下标for ((b=1; b<length-a; b++)) #设置作为与初始最大元素比较的元素下标范>围doif [ ${arr[$b]} -gt ${arr[$max]} ];thenmax=$bfidone#用当前轮数最大的元素与当前轮数最后一个元素交换位:last=$[length - a]tmp=${arr[$last]}arr[$last]=${arr[$max]}arr[$max]=$tmp
doneecho "排序后的数组顺序为 ${arr[@]}"
3.反转排序
3.1.概述
以相反的顺序把原有数组的内容重新排序
3.2.基本思想
把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所
有数组元素反转替换
3.3.实操
[root@localhost day14]# vim demo6.sh
[root@localhost day14]# bash demo6.sh
输入一个数组的列表: 50 42 32 11 5
原始数组的顺序为 50 42 32 11 5
#!/bin/bash
#反转排序
filp() {
array=($@)
length=${#array[@]}for ((a=0; a<length/2; a++))
dotmp=${array[$a]}last=$[length-1-a]array[$a]=${array[$last]}array[$last]=$tmp
doneecho "反转排序后的数组顺序为 ${array[@]}"
}
read -p "输入一个数组的列表: " num
arr=($num)
echo "原始数组的顺序为 ${arr[@]}"filp ${arr[@]}
相关文章:

【Shell脚本】Shell编程之数组
目录 一.数组 1.基本概念 2.定义数组的方法 2.1.方法一 2.2.方法二 2.3.方法三 2.4.方法四 2.5.查看数组长度 2.6.查看数组元素下标 3.数组分片 4.数组字符替换 4.1.临时替换 4.2.永久替换 5.数组删除 5.1.删除某个下标 5.2.删除整组 6.数组遍历和重新定义 7…...

Python 全栈系列246 任务调度对象WFlaskAPS
说明 之前已经完全跑通了任务调度,实现了S2S的流转Python 全栈系列243 S2S flask_celery。由于request请求用起来比较别扭,所以创建一个对象来进行便捷操作。 内容 1 功能 WFlaskAPS包含管理定时任务的必要功能 from datetime import datetime from…...

关于Windows中的NTUSER.DAT文件的知识,看这篇文章就差不多了
每个用户配置文件中都隐藏着一个名为NTUSER.DAT的文件。此文件包含每个用户的设置和首选项,因此你不应该删除它,也可能不应该编辑它。Windows会自动为你加载、更改和保存该文件。 NTUSER.DAT包含你的用户配置文件设置 每次更改Windows和已安装程序的外观和行为时,无论是桌…...

【Linux】动态库与静态库的底层比较
送给大家一句话: 人生最遗憾的,莫过于,轻易地放弃了不该放弃的,固执地坚持了不该坚持的。 – 柏拉图 (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) (x(x_(x_x(O_o)x_x)_x)x) 底层比较 1 前言2 编译使用比较2 如何加载Than…...

私活更好用:SpringBoot开源项目!!【送源码】
今天分享一款非常香的SpringBoot大屏开源项目,非常适合接私活用。 这是一款基于SpringBoot代码生成器的快速开发平台!采用前后端分离架构:SpringBoot,Mybatis,Shiro,JWT,Vue&Ant Design。强…...

SprintBoot案例-增删改查
黑马程序员JavaWeb开发教程 文章目录 一、准备工作1. 准备数据库表1.1 新建数据库mytlias1.2 新建部门表dept1.3 新建员工表emp 2. 准备一个Springboot工程2.1 新建一个项目 3. 配置文件application.properties中引入mybatis的配置信息,准备对应的实体类3.1 引入myb…...

【机器学习】:基于决策树与随机森林对数据分类
机器学习实验报告:决策树与随机森林数据分类 实验背景与目的 在机器学习领域,决策树和随机森林是两种常用的分类算法。决策树以其直观的树形结构和易于理解的特点被广泛应用于分类问题。随机森林则是一种集成学习算法,通过构建多个决策树并…...

.NET 4.8和.NET 8.0的区别和联系、以及查看本地计算机的.NET版本
文章目录 .NET 4.8和.NET 8.0的区别查看本地计算机的.NET版本 .NET 4.8和.NET 8.0的区别 .NET 8.0 和 .NET 4.8 之间的区别主要体现在它们的发展背景、目标平台、架构设计和功能特性上。下面是它们之间的一些主要区别: 发展背景: .NET 4.8 是.NET Fram…...

23.HashMap的put方法流程
一、put方法的流程图 二、put方法的执行步骤 首先,根据key值计算哈希值。然后判断table数组是否为空或者数组长度是否为0,是的话则要扩容,resize()。接着,根据哈希值计算数组下标。如果这个下标位置为空&a…...

元类结合__new__
__new__:用来生成骨架 __init__:骨架添加血肉 【一】类中的__new__ class MyClass(object):def __init__(self,name,age):print(f"给当前MyClass类的对象初始化属性的时候会触发__init__")self.name nameself.age age def __call__(self,*args,**kwargs):pri…...

(C语言)队列实现与用队列实现栈
目录 1.队列 1.1队列的概念及结构 1.2 队列的实际应用联想 1.3队列的实现 2. 队列应用——队列实现栈 主要思路 1.队列 1.1队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进…...

字符画生成网站 ascii字符画
_____ / ___/__ ___ / /__/ _ \/ _ \ \___/ .__/ .__//_/ /_/ font推荐:1.Slant 2.Small 3.Small slant https://patorjk.com/software/taag/#pdisplay&fSmall%20Slant&tCpp https://www.kammerl.de/ascii/AsciiSignature.php https://asciia…...

【C -> Cpp】由C迈向Cpp (6):静态、友元和内部类
标题:【C -> Cpp】由C迈向Cpp (6):静态、友元和内部类 水墨不写bug (图片来源于网络) 目录 (一)静态成员 (二)友元 (三)…...

探索Playwright:Python下的Web自动化测试革命
在如今这个互联网技术迅速发展的时代,web应用的质量直接关系着企业的声誉和用户的体验。因此,自动化测试成为了保障软件质量的重要手段之一。今天,我将带大家详细了解一款在测试领域大放异彩的神器——Playwright,并通过Python语言…...

先有JVM还是先有垃圾回收器?很多人弄混淆了
是先有垃圾回收器再有JVM呢,还是先有JVM再有垃圾回收器呢?或者是先有垃圾回收再有JVM呢?历史上还真是垃圾回收更早面世,垃圾回收最早起源于1960年诞生的LISP语言,Java只是支持垃圾回收的其中一种。下面我们就来刨析刨析…...

关于 vs2019 c++20 规范里的一个全局函数 _Test_callable
(1)看名思议,觉得这个函数可以测试其形参是否是可以被调用的函数,或可调用对象? 不,这个名字不科学。有误导,故特别列出。看下其源码(该函数位于 头文件): 辅…...

07-Fortran基础--Fortran指针(Pointer)的使用
07-Fortran基础--Fortran指针Pointer的使用 0 引言1 指针(Poionter)的有关内容1.1 一般类型指针1.2 数组指针1.3 派生类(type)指针1.4 函数指针 2 可运行code 0 引言 Fortran是一种广泛使用的编程语言,特别适合科学计算和数值分析。Fortran 9…...

日期差值,
日期差值 ac代码 #include<iostream> using namespace std; int ans0; int get(int n){int mon[14]{0,31,28,31,30,31,30,31,31,30,31,30,31};ans0;int m_dayn%100;int m_month(n/100)%100;int m_year(n/10000);ansm_day;while(m_month--){//加上月数if((m_year%40&…...

GMV ES6直流变频多联空调机组室外机工作原理
GMV ES6直流变频多联空调机组室外机工作原理如下: 内机为制冷模式运行时,室外机根据室内机的运行负荷需求启动运行,室外换热器作为系统的冷凝器,各制冷室内机的换热器并联作为系统的蒸发器,通过室内机的送回风循环实现…...

中国开源 AI 大模型之光-InternLM2
今天给大家带来 AI 大模型领域的国产之光 - InternLM2,在10B量级开源大模型领域取得了全球 Top 3 的成绩,仅次于 Meta 发布的 Llama-3,在国内则是第一名的存在! 简介 InternLM2是由上海人工智能实验室和商汤科技联合研发的一款大型…...

【嵌入式开发】Arduino人机界面及接口技术:独立按键接口,矩阵按键接口,模拟量按键接口(基础知识介绍)
“生活总是让我们遍体鳞伤,但到后来,那些受伤的地方一定会变成我们最强壮的地方。” 🎯作者主页: 追光者♂🔥 🌸个人简介: 📝[1] CSDN 博客专家📝 🏆[2] 人工智能领域优质创作者🏆 🌟[3] 2022年度博客之星人工智能领域TOP4🌟 🌿[4] …...

element ui Tree树形控件
lazy 是否懒加载子节点,需与 load 方法结合使用 boolean 默认为falseload 加载子树数据的方法,仅当 lazy 属性为true 时生效 function(node, resolve)使用懒加载load不需要再使用data,利用resolve返回值即可注意:第一层的数据要写…...

AI 绘画神器 Fooocus 图生图:图像放大或变化、图像提示、图像重绘或扩充、反推提示词、生成参数提取、所需模型下载
本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 大家好,我是水滴~~ 本文讲述 Fooocus 的图生图功能,主要内容包括:图像放大或变化、图像提示、图像重绘或扩充、反推…...

yolov8 模型架构轻量化 | 极致降参数量
模型轻量化加速是深度学习领域的重要研究方向,旨在减小模型的体积和计算复杂度,从而提高在资源受限设备上的运行效率,模型参数量在轻量化加速中扮演着至关重要的角色。 首先,模型参数量直接决定了模型的复杂度和存储空间需求。随…...

uniapp 小程序低功耗蓝牙配网 ble配网 物联网
1.获取蓝牙列表 bleList.vue <template><view><button touchstart"startSearch">获取蓝牙列表</button><scroll-view :scroll-top"scrollTop" scroll-y class"content-pop"><viewclass"bluetoothItem&q…...

服务器防火墙有什么用防护策略
随着互联网的飞速发展,服务器的安全问题日益凸显。为了保护服务器免受网络攻击和恶意入侵的威胁,人们引入了防火墙的概念。服务器防火墙作为保护服务器的第一道防线,具有重要的作用。那么服务器防火墙有什么用? 首先,服…...

27.哀家要长脑子了!
目录 1.316. 去除重复字母 - 力扣(LeetCode) 2. 1209. 删除字符串中的所有相邻重复项 II - 力扣(LeetCode 哎哟 烦死了 刚刚不小心退出又没保存 又要写一遍 烦死了 最近刷题不得劲啊 感觉这脑子没长一点 1.316. 去除重复字母 - 力扣&am…...

Redis实战—验证码登录注册
目录 基于Session Controller层 Service层 ServiceImpl层 编辑校验登录状态 ThreadLocal 登录拦截器 添加拦截器到Config Controller层实现 基于Redis ServiceImpl 新增刷新拦截器 添加拦截器到Config 基于Session Controller层 /*** 发送手机验证码*/PostMappi…...

对话机器人技术解说
一、RAG介绍 如何不通过微调模型来提高LLM性能,检索增强生成(RAG)是未来的发展方向。 Embedding:将文档的句子或单词块转换为数字向量。就向量之间的距离而言,彼此相似的句子应该很近,而不同的句子应该离…...

红黑树底层封装map、set C++
目录 一、框架思考 三个问题 问题1的解决 问题2的解决: 问题3的解决: 二、泛型编程 1、仿函数的泛型编程 2、迭代器的泛型编程 3、typename: 4、/--重载 三、原码 红黑树 map set 一、框架思考 map和set都是使用红黑树底层&…...