数组

  • 数组中可以存放多个值(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. 3.CRUD及批量操作

    文档的CRUD index 和 create 操作用put(但是如果没有指定id必须用post,指定了id的可以用post,也可以用put) update和创建索引用post 获取用get 删除用de ...

  2. Linux 中查看文件系统的块大小

    有时可能需要查看 Unix 操作系统中有关于文件基本单元的块大小,以便对有的系统进行适当的优化(如 MySQL),本文将介绍几种在 Unix 上以及类 Unix 操作系统上可行的查看方式 检查文件系统 ...

  3. 还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具

    之前写过一篇文章 我理想中的低代码开发工具的形态,已经吐槽了各种封装 xxxForm,xxxTable 的行为,这里就不啰嗦了.今天再来看看我的工具达到了什么程度. 多图预警... 以管理后台一个列表 ...

  4. 《华为云DTSE》期刊2023年第二季—HDC.Cloud 2023专刊

    本文分享自华为云社区<<华为云DTSE>期刊2023年第二季-HDC.Cloud 2023专刊>,作者: HuaweiCloudDeveloper . AI技术风起云涌,百家争 ...

  5. 适合新手的12个Mybatis-Plus常用注解

    摘要:MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 本文分享自华为云社区<那些年,我们一起学过 ...

  6. 【万字干货】OpenMetric与时序数据库存储模型分析

    摘要:解读OpenMetric规范和指标的模型定义基础上,结合当下主流的时序数据库核心存储及处理技术,尝试让用户(架构师.开发者或使用者)结合自身业务场景选择合适的产品,消除技术选型的困惑. 本文分享 ...

  7. 云图说|初识云数据库GaussDB(for Redis)

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:云数据库Gauss ...

  8. 云小课|打造企业数据“高内聚,低耦合”--试试GaussDB(DWS)逻辑集群,实现数据物理隔离

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:逻辑集群是基于No ...

  9. Building wheel for opencv-python (pyproject.toml) ,安装命令增加 --verbose 参数

    安装时间较长,通过 --verbose 参数 可以看在不在继续 Mac 安装 paddlehub 出现 Building wheels for collected packages: opencv-p ...

  10. auth认证模块 auth_user表扩展

    目录 auth认证模块前戏 django后台管理功能 创建超级管理员 auth认证相关模块及操作 用户注册 用户登录 网站首页效果 校验用户登录的装饰器 用户修改密码 用户注销登录 auth_user ...