数组

  • 数组中可以存放多个值(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. 《An End-to-end Model for Entity-level Relation Extraction using Multi-instance Learning》阅读笔记

    代码   原文地址   预备知识: 1.什么是MIL? 多示例学习(MIL)是一种机器学习的方法,它的特点是每个训练数据不是一个单独的实例,而是一个包含多个实例的集合(称为包).每个包有一个标签,但是 ...

  2. JNA入门(一)

    JNA入门,代码在github写得明明白白:https://github.com/java-native-access/jna/blob/master/www/GettingStarted.md 一. ...

  3. JavaImprove--Lesson02--Object类,Objects工具类,封装类

    一.Object类 Java中的Object类是所有类的超类,它是Java类层次结构的根类.这意味着所有的类都直接或间接地继承自Object类 equals(Object obj): 用于比较两个对象 ...

  4. 伯克利:serverless是下一代计算范式

    摘要:Serverless技术正是云厂商的基于规模经济的一个选择. 引子 刚过去的HC2020,华为面向多样化算力的时代,发布了DC分布式计算的三个开发套件,其中一个是元戎组件.元戎是基于函数计算的分 ...

  5. 从Encoder-Decoder模型入手,探索语境偏移解决之道

    摘要:在本文中,我们展示了CLAS,一个全神经网络组成,端到端的上下文ASR模型,通过映射所有的上下文短语,来融合上下文信息.在实验评估中,我们发现提出的CLAS模型超过了标准的shallow fus ...

  6. 复杂 A/B 实验如何设计?火山引擎 DataTester 帮你落地!

    数字化转型时代,越来越多企业将目光聚焦于"数据驱动增长"的实践上,A/B 实验则在其中扮演着愈加重要的角色. A/B 实验又称对照试验,但并非人们字面认知的"抛出 A 和 ...

  7. Python中节省内存的方法之二:弱引用weakref

    弱引用和引用计数息息相关,在介绍弱引用之前首先简单介绍一下引用计数. 引用计数 Python语言有垃圾自动回收机制,所谓垃圾就是没有被引用的对象.垃圾回收主要使用引用计数来标记清除. 引用计数:pyt ...

  8. CNCF大使预测:2024年云原生面临倦怠、离职及云成本精简

    本文由 CNCF 大使 Eric D. Schabell 撰写,预测2024年云原生领域最可能发生的3大变化,并与其对云原生可观测性领域的见解结合. 关注云原生倦怠 毫无疑问,在 2023 年中云原生 ...

  9. 文件描述符&文件句柄

    一.概念 1.1 文件描述符&文件描述符表 文件描述符(file descriptor, fd)是Linux系统中对已打开文件的一个抽象标记,所有I/O系统调用对已打开文件的操作都要用到它.这 ...

  10. Nginx--用户认证&&访问控制&&限速&&状态访问

    一 用户认证 某些网页只希望给特定的用户访问,可以设置用户认证,使用户访问时需要进行身份认证,只有认证通过才可访问网页 location / { root html; index index.html ...