shell脚本中数组的运用以及排序算法

news2025/2/28 17:01:02

shell脚本中数组的运用

  • 一、数组的介绍
    • 1、概念
    • 2、定义方法
    • 3、数组包括的数据类型
  • 二、关于数组的操作
    • 1、获取数组长度
    • 2、获取数组各个元素的下标
    • 3、获取数组列表或单个元素
    • 4、对数组切片输出
    • 5、对数组里的元素替换
    • 6、删除单个元素或数组
    • 7、数组追加元素
    • 8、向函数传入数组的值
  • 三、数组排序算法
    • 1、冒泡排序
      • 基本思想
      • 算法思路
      • 实现
    • 2、直接选择排序
      • 基本思想
      • 实现
    • 3、直接插入排序
      • 定义
      • 基本思想
      • 实现
    • 4、反转排序
      • 定义
      • 基本思想
      • 实现

一、数组的介绍

1、概念

数组:数组是存放相同类型数据的集合,在内存中开辟了连续的空间,通常配合循环使用。

2、定义方法

方法一):

数组名=(value0 value1 value2 ....)

方法二):

数组名=([0]=value [1]=value [2]=value ...)

方法三):

列表名=“value0 value1 value2 ....”
数组名=($列表名)

方法四):

数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”

3、数组包括的数据类型

  • 数值类型
  • 字符类型

字符类型要是应用双引号或单引号定于

二、关于数组的操作

1、获取数组长度

a=(1 2 3 4 5)
b=${#a[*]}
或
b=${#a[@]}

在这里插入图片描述

2、获取数组各个元素的下标

echo ${!a[@]}
或
echo ${!a[*]}

在这里插入图片描述

3、获取数组列表或单个元素

#获取数组列表
echo ${a[*]}
或
echo ${a[@]}

在这里插入图片描述

#获取单个元素
echo

在这里插入图片描述

4、对数组切片输出

 #将i数组的33 44 55输出
 i=(11 22 33 44 55)
 echo ${i[@]:1:3} 

在这里插入图片描述

5、对数组里的元素替换

a=(10 20 30 40 100)
echo ${a[@]/10/60}      //此方法替换只是输出时替换,但原数组并没有被替换

在这里插入图片描述

#永久替换相当于重新定义数组
b=(1 2 3 4 5)
b=(${b[@]/2/6})
echo ${b[@]}

在这里插入图片描述

6、删除单个元素或数组

#删除单个元素
c=(1 2 3 4 5 6)
echo ${!c[@]}
unset c[5]
echo ${c[@]}

#删除数组
unset c
echo ${c[@]}

在这里插入图片描述
注意:如果下标为0 1 2 3 4,把3删除了,下标就变成了0 1 2 4,不是0 1 2 3。

7、数组追加元素

方法一)
array_name[index]=value
方法二)
array_name[${#array_name[@]}]=value
方法三)
array_name=("${array_name[@]}" value1 ... valueN)
#双引号不能省略,否则,当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个。不能将"@"替换成“*”,不加双引号时与“@”表现一致,加双引号时,会将数组array_name中所有的元素作为一个元素添加到数组中
方法四)
array_name+=(value1 value2 ... valueN)
待添加元素必须用“()”包围起来,并且多个元素用空格分隔

方法一
在这里插入图片描述
方法二
在这里插入图片描述
方法三
在这里插入图片描述
方法四
在这里插入图片描述

8、向函数传入数组的值

在这里插入图片描述
在这里插入图片描述

三、数组排序算法

1、冒泡排序

冒泡排序:类似于气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。

基本思想

冒泡排序的基本思想时对比相邻的两个元素值,如果满足条件iu交换元素,把较小的元素移动到数组前面,把大的元素移动到数组的后满(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。

算法思路

冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用于对比数组中每个相邻元素的大小以确定是否交换位置,对比和交换次数随排序轮数而减少。
在这里插入图片描述

实现

在这里插入图片描述
在这里插入图片描述

2、直接选择排序

基本思想

将指定排序位置与其它数组元素分别对比,如果满足条件就交换元素值,注意这里区别冒泡排序,不是交换相邻元素,而是把满足条件的元素与指定的排序位置交换(如从最后一个元素开始排序),这样排序好的位置逐渐扩大,最后整个数组都成为已排序好的格式。
在这里插入图片描述

实现

#!/bin/bash
shuzu=(63 4 24 1 3 15)
length=${#shuzu[@]}

for ((a=1;a<length;a++))
do
  i=0
  for ((b=1;b<=length-a;b++))
  do
    if [ ${shuzu[$i]} -lt ${shuzu[$b]} ]
    then
      i=$b
    fi
  done
  last=$[length - a]
  tmp=${shuzu[$last]}
  shuzu[$last]=${shuzu[$i]}
  shuzu[$i]=$tmp
done
echo "排序后的数组值为:${shuzu[@]}"                              

在这里插入图片描述

3、直接插入排序

定义

插入排序,又叫直接插入排序。实际中,我们玩扑克牌的时候,就用了插入排序的思想

基本思想

在待排序的元素中,假设前n-1元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序,按照此法对所有的元素进行插入,直到整个序列有序。
但是我们并不能确定待安排元素中究竟哪儿一部分是有序的,所以我们一开始只能认为第一个元素是有序的,一次将后的元素插入到这个有序序列中来,直到整个序列有序为止。
在这里插入图片描述

实现

#!/bin/bash
arr=(5 2 4 6 1 3)
length=${#arr[@]}
echo "排序前的数组为:${arr[@]}"
for ((a=1;a<length;a++))
do
  for ((b=0;b<a;b++))
  do
    if [ ${arr[$a]} -lt ${arr[$b]} ]
    then
      tmp=${arr[$a]}
      arr[$a]=${arr[$b]}
      arr[$b]=$tmp
    fi
  done
done

echo "排序后的数组为:${arr[@]}"

在这里插入图片描述

4、反转排序

定义

反转排序是以相反的顺序把原有数组的内容重新排序

基本思想

把数组最后一个元素和第一个元素替换,倒数第二个元素和第二个元素替换,依此类推,直到把所有数组反转替换。

实现

#!/bin/bash
arr=(1 2 3 4 5)
echo "反转排序前的数组为:${arr[@]}"
length=${#arr[@]}
for ((a=0;a<length/2;a++))
do
  tmp=${arr[$a]}
  arr[$a]=${arr[$length-1-a]}
  arr[$length-1-a]=$tmp
done

echo "反转排序后的数组为:${arr[@]}"

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/520261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Learning C++ No.20 【红黑树实战】

引言&#xff1a; 北京时间&#xff1a;2023/5/12/20:30&#xff0c;今天周五&#xff0c;周五不摆烂从我做起&#xff0c;虽然刚睡醒&#xff0c;但是今天如果论学习时长&#xff0c;那可能是许久以来最长的一天&#xff0c;从早上6:40晨跑回来坐在凳子上&#xff0c;一坐久坐…

在 I/O 看未来 | 开发者集合!官方学习资源已更新,即 课 解锁新技能!

看完 Google I/O 2023 的精彩内容 你是否已跃跃欲试&#xff0c;准备充电学习&#xff1f; 马上跟随 Google 开发者在线课程 刷新知识储备和开发技能 将技术热爱落地为实践应用&#xff01; "解码 Google I/O 洞见科技未来" 征文活动 也向身为技术爱好者的你发出召唤…

【Wi-Fi】802.11/802.11b/802.11g/802.11n/802.11a/802.11ac/802.11ax/802.11be

WiFi发展历史 IEEE 802.11 Protocol Release Date Frequency Band Bandwidth Max Throughput 802.11-1997 1997 2.4GHz 22MHz 2Mbps 802.11b 1999 2.4GHz 22MHz 11Mbps 802.11a 1999 5GHz 20MHz 54Mbps 802.11g 2003 2.4GHz 20MHz 54Mbps 802.11n (W…

Kubernetes❀实战入门

Kubernetes❀实战入门 4. 实战入门4.1 Namespace4.1.1 **查看**4.1.2 **创建**4.1.3 **删除**4.1.4 **配置方式** 4.2 Pod4.2.1 创建并运行4.2.2 查看pod信息4.2.3 访问Pod4.2.4 删除指定Pod4.2.5 配置操作 4.3 Label4.3.1 命令方式4.3.2 配置方式 4.4 Deployment4.4.1待操作。…

第二章 介绍Productions - 互操作性制作简介

文章目录 第二章 介绍Productions - 互操作性制作简介介绍Productions设置Production的消息流 第二章 介绍Productions - 互操作性制作简介 互操作性产品的目的是使能够连接系统&#xff0c;以便可以在它们之间转换和路由消息。要连接系统&#xff0c;需要开发、配置、部署和管…

( 位运算 ) 693. 交替位二进制数 ——【Leetcode每日一题】

❓693. 交替位二进制数 难度&#xff1a;简单 给定一个正整数&#xff0c;检查它的二进制表示是否总是 0、1 交替出现&#xff1a;换句话说&#xff0c;就是二进制表示中相邻两位的数字永不相同。 示例 1&#xff1a; 输入&#xff1a;n 5 输出&#xff1a;true 解释&#…

【FreeRTOS】——API函数任务创建与删除挂起与恢复

目录 前言&#xff1a; 一、任务创建与删除的API函数 二、任务挂起与恢复的API函数 总结&#xff1a; 前言&#xff1a; 博客笔记根据正点原子视频教程编辑&#xff0c;仅供学习交流使用&#xff01; 一、任务创建与删除的API函数 任务的创建和删除的本质就是调用FreeRT…

小宁ChatGPT智能机器人上线,无需魔法注册即可使用!

​大家好&#xff0c;今天我要向大家介绍一款基于人工智能技术的聊天机器人——ChatGPT。ChatGPT可以与用户进行自然语言交互&#xff0c;回答用户的问题、提供服务、进行闲聊等&#xff0c;让聊天变得更有趣。 小宁ChatGPT是对接ChatGPT官方api&#xff0c;实现无需魔法无误差…

使用Visual Studio 2019 创建JNI式的动态库及在Java代码中的使用

文章目录 JNI简介JNI 数据类型与 Java 、C 类型对比JNI式动态库函数编码规则Visual Studio下的编码JNI式动态库在Java代码中的使用改进版通过javah命令自动生成.h文件 JNI简介 JNI (Java Native Interface) 是 Java 沟通 Native 语言&#xff08;主要是C、C&#xff09;的桥梁…

《花雕学AI》34:用13种Prompt玩转AI聊天机器人—揭秘ChatGPT模型

引言&#xff1a; 聊天机器人是一种能够通过自然语言进行交流的智能系统&#xff0c;它可以模仿人类的对话方式&#xff0c;提供各种信息、服务或娱乐。随着人工智能技术的发展&#xff0c;聊天机器人的应用越来越广泛&#xff0c;从电商、教育、医疗、旅游等领域&#xff0c;到…

Spring ( 四 ) 注解注入

3.2.注解方式 目前 主流的方式 是使用注解方式来实现IoC效果. 3.2.1.配置类 在 config包下增加 SpringConfig 配置类 Configuration 声明当前类为配置类, SpringIoC容器会根据配置类信息进行配置 ComponentScan() bean扫描路径 , SpringIoC容器只维护 声明的路径下的增加&q…

华为OD机试真题 Java 实现【最多提取子串数目】【2023Q1 100分】

一、题目描述 给定由[a-z] 26 个英文小写字母组成的字符串 A和 B&#xff0c;其中A中可能存在重复字母&#xff0c;B 中不会存在重复字母&#xff0c;现从字符串 A 中按规则挑选一些字母&#xff0c;可以组成字符串 B。 挑选规则如下: 同一个位置的字母只能被挑选一次&#…

Qt连接Sqlite3并使用Qtableview实时显示数据,重写QSqlQueryModel实现文本居中

文章目录 前言一、引入SQL模块二、数据库的基本操作三、示例完整代码四、下载链接总结 前言 什么是 SQLite&#xff1f; SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其…

软件 工程

目录 第十章、软件工程1、瀑布模型&#xff08;SDLC&#xff09;2、快速原型模型3、增量模型4、螺旋模型5、Ⅴ模型6、喷泉模型7、构建组装模型&#xff08;CBSD&#xff09;8、统一过程&#xff08;RUP&#xff09;9、敏捷开发方法10、信息系统开发方法11、需求开发12、结构化设…

Codeforces Round 872 (Div. 2) 题解

总结&#xff1a;5.9有同学问B题&#xff0c;所以就连同ABC题一起做了&#xff0c;都算是思维题吧&#xff0c;难度不算高 A. LuoTianyi and the Palindrome String 思路&#xff1a;输入的都为回文字符串&#xff0c;如果输入的回文字符串每个字符都相同&#xff0c;如"…

QT+VS推箱子小游戏

1、创建一个GUI程序&#xff0c;将界面设计成如下样式&#xff1a; 创建一个已QDialog为基类的子类&#xff0c;在窗体里添加一个pushbutton的按钮&#xff0c;一个QLabel用来显示文字。窗体的背景图片和按钮的背景颜色&#xff0c;都可以在样式中进行设计。 2、右键项目名称&…

ChatGPT 实现云原生转型

云原生转型 在相对专业的细分领域&#xff0c;chatGPT 能起到什么作用呢&#xff1f;能给出什么回答&#xff0c;怎么问才能得到好的回答呢&#xff1f;本节内容&#xff0c;将尝试从一个业界其实也还没有定论的话题&#xff0c;开始问答。这就是&#xff1a;云原生转型。 &q…

OpenCV教程——图像模糊。均值模糊,高斯模糊,中值模糊,双边模糊,高斯分布

1.图像模糊 图像模糊是图像处理中最简单和常用的操作之一。 ⚠️使用该操作的原因之一是为了给图像预处理时降低噪声。 图像模糊操作背后是数学的卷积计算。 卷积操作的原理&#xff1a; 常用的图像模糊的方法&#xff1a; 均值模糊高斯模糊中值模糊双边模糊 这四种模糊方式…

商用密码应用安全性测评机构资质流程

商用密码应用安全性测评机构&#xff08;简称密评机构&#xff09;资质建设相关指导性材料包括&#xff1a; 1、《商用密码应用安全性测评机构能力要求》 2、《商用密码应用安全性测评机构能力评审实施细则&#xff08;试行&#xff09;》 3、《商用密码应用安全性测评机构管理…

【Rust】速度入门---打印个螃蟹先

参考: 菜鸟教程 1 输出到命令行 这不得打印个螃蟹 // 代码来自官方入门教程 // ferris_say需要另外安装 use ferris_says::say; use std::io::{stdout, BufWriter};fn main() {let stdout: std::io::Stdout stdout();let msg: String String::from("Hello fellow Rusta…