数组

  • 数组中可以存放多个值(bash 只支持一维数组)
  • 数组元素的索引从0开始
  • 数组在括号内指定数组的值,每个值仅能用空格分割

其中:
30为索引0
20为索引1
10为索引2
60为索引3
以此类推,不过注意索引是从0开始的

如果数组中有三个参数:1 2 3
运行数组脚本后
"$*" 为 “1 2 3” (作为一个整体使用)
"$@" 为“1” “2” “3” (分别作为单个的个体使用)
"$#" 为3 (表示参数的数量,也可以叫做长度) 不加双引号时与"@"的表现一致,加双引号时,会将数组arr1中的所有元素作为一个元素添加到数组中。

可以简单的理解为:用*号是作为一个整体,而用@还是单个的个体。 \(*</span>、<span class="token variable">\)@不加双引号时表现一致;加双引号时,$*会将所有参数作为一个整体。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

数组定义方法

方法一:

数组名=(value0 valuel value2 …)

举例:

方法二:

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

举例:

方法三:

列表名=“value0 valuel value2 …”
数组名=($列表名)

举例:

方法四:

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

举例:

数组包括的数据类型

数值类型
字符类型
使用" "或‘ ’定义

获取数组长度

读取某下标赋值

数组遍历


数组切片

取数组中的某一段的元素的值

格式:
${数组名[@或*]}:起始位置(起始索引):长度

数组替换

永久替换

格式:
$(数组名[@或*]/查找字符/替换字符}

删除数组

使用unset删除数组

删除数组中的某个索引对应的元素的值

追加数组中的元素

在数组中原有的元素后面再追加一些元素

从函数返回数组

调用新数组的元素进行函数运算

加法传参运算


乘法传参运算


数组排序算法

冒泡排序

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

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

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

#!/bin/bash
abc=(20 10 60 40 50 30) #定义一个数组
echo "原数组的排列顺序为:${abc[*]}"
length=${#abc[*]} #定义原数组的长度为length变量
for ((i=1;i<$length;i++)) #定义排序轮次
do
for ((k=0;k<$length-i;k++)) #确定第一个元素的索引位置
do
first=${abc[$k]} #定义第一个元素的值
j=$[$k+1] #定义第二个元素的索引号
second=${abc[$j]} #定义第二个元素的值
if [ $first -gt $second ] #第一个元素和第二个元素比较,如果第一个元素比第二个元素大则互换
then
temp=$first #把第一个元素的值保存在临时变量temp中
abc[$k]=$second #把第二个元素的值赋给第一个元素
abc[$j]=$temp #把原第一个元素的值,赋给第二个元素
fi
done
done echo "排序后数组的排列顺序为${abc[*]}" #输出排序后的数组
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21


直接选择排序

与冒泡排序相比,直接选择排序的交换次数更少,所以速度会快些。

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

#!/bin/bash
abc=(63 4 24 1 3 15) #定义一个数组
echo "原数组的排列顺序为${abc[*]}"
length=${#abc[*]} #定义原数组的长度,这里原数组的长度为6 for ((i=1;i<$length;i++)) #这里是定义比较的轮数,比较5次

do

index=0 #表示从索引0开始比较 for ((k=1;k<=\(length<span class="token operator">-</span>i<span class="token punctuation">;</span>k<span class="token operator">++</span><span class="token punctuation">))</span></span> <span class="token comment">#这里是确定用于比较的第一个元素的索引范围,比如已经定义了从索引0开始了,所以和0进行比较的范围就是从索引1-5了</span>
<span class="token keyword">do</span>
<span class="token assign-left variable">first</span><span class="token operator">=</span><span class="token variable">\){abc[\(k<span class="token punctuation">]</span>}</span> <span class="token comment">#定义与index相比较的索引的取值为first</span>
<span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">\)first -gt \({abc<span class="token punctuation">[</span>\)index]} ] #通过将index所在的索引的值与k所在的索引的值进行比较,获取最大元素的索引位置

then

index=\(k</span>
<span class="token comment">#通过比较将较大的数定义到index中,进行下一轮的比较</span>
<span class="token keyword">fi</span>
<span class="token assign-left variable">last</span><span class="token operator">=</span>\)[\(length</span>-<span class="token variable">\)i] #获取在比较的范围中的最后一个元素的索引

temp=\({abc<span class="token punctuation">[</span>\)last]} #将上一步获取到的最后一个元素的索引的值保存到临时变量temp中

abc[\(last</span><span class="token punctuation">]</span><span class="token operator">=</span><span class="token variable">\){abc[\(index<span class="token punctuation">]</span>}</span> <span class="token comment">#把最大上面for循环比较出来的最大元素的值赋值给最后一个元素</span>
abc<span class="token punctuation">[</span><span class="token variable">\)index]=$temp #把原来最后一个元素的值赋给原来最大值的位置的元素

done

done echo "排序后数组的排列顺序为${abc[*]}" #输出排序后的数组
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26


反转排序

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

基本思想:
把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所有数组元素反转替换。

#!/bin/bash
abc=(1 23 sf 43 s 6 we 8 9)
len=${#abc[*]}
echo "原来的数组排列顺序是:${abc[*]}"
for ((i=0;i<$len/2;i++))
do
temp=${abc[$i]}
abc[$i]=${abc[$len-$i-1]}
abc[$len-$i-1]=$temp
done
echo "反转后数组的排列顺序是:${abc[*]}"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12


文章知识点与官方知识档案匹配,可进一步学习相关知识
云原生入门技能树首页概览12760 人正在系统学习中

[转帖]Shell脚本数组(实现冒泡排序,直接选择排序,反转排序)的更多相关文章

  1. shell脚本-数组

    shell脚本-数组 数组 变量:存储单个元素的内存空间. 数组:存储多个元素的连续的内存空间,相当于多个变量的集合. 数组索引:编号从0开始,属于数值索引.索引可支持使用自定义的格式,而不仅是数值格 ...

  2. [转帖]Shell脚本中的break continue exit return

    Shell脚本中的break continue exit return 转自:http://www.cnblogs.com/guosj/p/4571239.html break结束并退出循环 cont ...

  3. shell脚本——数组

    连续的变量 解决:变量过多的问题,在同一类变量中,不需要定义多个名字,而是以数组的方式来定义 定义数组: declare -I 定义整数 declare -a 定义数组 declare -A 定义嵌套 ...

  4. 【shell脚本】将三个数字进行升序排序===numSort.sh

    从命令输入三个数字进行升序排序(冒泡排序) 原理:比较两个相邻的元素,将值大的元素交换至右端. 脚本内容: [root@VM_0_10_centos shellScript]# cat numSort ...

  5. linux shell 脚本攻略学习8---md5校验,sort排序,uniq命令详解

    一.校验与核实 目前最为出名的校验技术是md5sum和sha1sum,它们对文件内容使用相应的算法来生成校验和. 举例: amosli@amosli-pc:~/learn$ md5sum text.t ...

  6. shell脚本,按字母出现频率降序排序。

    [root@localhost oldboy]# cat file the squid project provides a number of resources toassist users de ...

  7. shell脚本,按单词出现频率降序排序。

    [root@localhost oldboy]# cat file the squid project provides a number of resources toassist users de ...

  8. Shell 编程 数组

    本篇主要写一些shell脚本数组的使用. 数组定义 数组名=(value0 value1 vlaue2 ...) 数组名=([0]=value [1]=value [2]=vlaue ...) 列表名 ...

  9. 基于数组的shell脚本编写

    基于数组的shell脚本编写 2017年08月17日 22:56:36 momokuku123 阅读数:369 数据:变量,文件,数组 变量:存储单个元素的内存中的一块存储空间 数组:存储多个元素的内 ...

  10. 如何在linux Shell脚本里面把一个数组传递到awk内部进行处理

    前段时间和几位同事讨论过一个问题:Shell脚本里面怎样把一个数组传递到awk内部进行处理? 当时没有找到方法.前两天在QQ群里讨论awk的时候,无意间又聊起这个话题.机缘巧合之下找到一个思路,特此分 ...

随机推荐

  1. 教你如何在Python中读,写和解析CSV文

    摘要:在这篇文章中关于"在Python如何阅读CSV文件"中,我们将学习如何读,写和解析的CSV文件的Python. 您知道将表格数据存储到纯文本文件背后的机制是什么吗?答案是CS ...

  2. 技术实践丨Prometheus+Grafana搭建HBase监控仪表盘

    摘要:Grafana+Prometheus是目前非常流行的监控方案,图形化展示非常强大. 简介 ● HBase是一个分布式的.面向列的开源数据库,开源版本默认提供了展示集群信息的UI,可以显示集群的实 ...

  3. Colocate Join :ClickHouse的一种高性能分布式join查询模型

    摘要:本文将介绍业界MPP分布式数据库join查询模型,以及ClickHouse的分布式查询原理解析和Colocate join性能表现. 本文分享自华为云社区<ClickHouse一种高性能分 ...

  4. ​HTML代码混淆技术:原理、应用和实现方法详解

    ​ HTML代码混淆是一种常用的反爬虫技术,它可以有效地防止爬虫对网站数据的抓取.本文将详细介绍HTML代码混淆技术的原理.应用以及实现方法,帮助大家更好地了解和运用这一技术. 一.HTML代码混淆的 ...

  5. SAST + SCA: 结合使用安全升级

    据 SAP 称,当今85%的安全攻击针对的是软件应用程序,因此一些列应用程序安全测试工具也应运而生.为了避免这些恶意攻击,企业通常使用应用程序安全测试工具来去缓解和解决安全风险,而不同的工具对应的使用 ...

  6. SpringBoot 配置 Swagger

    Profile Config 多环境不同配置 1.添加 Pom 文件 <dependency> <groupId>io.springfox</groupId> &l ...

  7. WebService autoconfigure.web.servlet.DispatcherServletPath

    SpringBoot WebService 源代码:https://gitee.com/VipSoft/VipWebService SpringBoot 整合 WebService cxf 报错 Co ...

  8. 从数据链路到神秘的MAC地址和ARP协议

    引言 链路是指从一个结点到相邻结点的一段物理线路.数据链路是在链路的基础上增加了一些必要的硬件和软件.这些硬件包括网络适配器,而软件则包括协议的实现.在网络中,主机.路由器等设备都必须实现数据链路层. ...

  9. 从 AI 绘画到 ChatGPT,聊聊生成式 AI

    我们小时候经常有幻想,未来不用再去上班了,在工厂工作的都是机器人.在家也不用打扫卫生,机器人可以包揽一切.不知不觉间,我们小时候的幻想已经慢慢变成现实,工厂里有了多种型号的机械臂,代替了部分流水线功能 ...

  10. WebRTC SDP 详解和剖析

    WebRTC 是 Web Real-Time Communication,即网页实时通信的缩写,是 RTC 协议的一种 Web 实现,项目由 Google 开源,并和 IETF 和 W3C 制定了行业 ...