[转帖]Shell脚本数组(实现冒泡排序,直接选择排序,反转排序)

shell,脚本,数组,实现,冒泡排序,直接,选择,排序,反转 · 浏览次数 : 0

小编点评

#!/bin/bashabc=(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]=$tempdone echo \"反转后数组的排列顺序是:${abc[*]}\"123456789101112 文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览12760 人正在系统学习中 .归纳总结以上内容,生成内容时需要带简单的排版 123456789101112314151617181920212223242526

正文


数组

  • 数组中可以存放多个值(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脚本数组(实现冒泡排序,直接选择排序,反转排序)相似的内容:

[转帖]Shell脚本数组(实现冒泡排序,直接选择排序,反转排序)

目录 数组数组定义方法数组包括的数据类型获取数组长度读取某下标赋值 数组遍历数组切片数组替换删除数组追加数组中的元素从函数返回数组加法传参运算乘法传参运算 数组排序算法冒泡排序直接选择排序反转排序 数组 数组中可以存放多个值(bash 只支持一维数组)数组元素的索引从0开始数组在括号内指定数组的值,

[转帖]shell脚本循环查询数据库实现数据输出到csv

https://blog.csdn.net/m0_46897923/article/details/125906115?spm=1001.2014.3001.5501 可以利用这个思路高点事情吧.. 一、shell脚本和数据文件 1.shell脚本 cat data.txt|while read l

[转帖]shell编程之循环语句

目录 一、循环语句for循环for语句的结构嵌套循环 while语句的结构while语句应用示例 until语句的结构until语句示例 二、跳出循环continue跳出循环break跳出循环 三、常用循环脚本实例循环打印9*9乘法表数字累加脚本(1-100)常用转义字符购物shell 计算器正等腰

[转帖]linux shell 脚本一些主要知识点整理

文章目录 一、/bin/sh 与 /bin/bash 的区别二、vi与vim的区别三、shell变量四、Shell字符串五、Shell函数六、Shell基本运算符1、Shell expr:进行整数计算2、Shell (()):对整数进行数学运算3、Shell let:对整数进行数学运算4、Shell

[转帖]如何通过shell脚本对一个文件中的所有数值相加并求和

https://developer.aliyun.com/article/886170?spm=a2c6h.24874632.expert-profile.255.7c46cfe9h5DxWK 1.背景 在一些巡检脚本中有时通常需要把一个文件中的数值进行相加得出综合,由于是文件中的所有数值,因此不能

[转帖]Linux—编写shell脚本操作数据库执行sql

Linux—编写shell脚本操作数据库执行sql Hughman关注IP属地: 北京 0.0762020.03.20 09:02:13字数 295阅读 1,036 修改数据库数据 在升级应用时,我们常常会遇到升级数据库的问题,这就涉及到sql脚本的编写。 一般我们会通过写sql脚本,然后将xxx.

[转帖]Shell 标准输入和输出

https://my.oschina.net/jiagoushi/blog/5609783 无论是要交给程序处理的数据,还是控制脚本的简单命令,都少不了输入和输出。程序要做的第一件事就是处理如同一阴一阳的 “输入与输出”。 1 、从文件获取输入 当我们希望向文件输出内容时,我们可以通过符号 > 或

[转帖]Shell 脚本中经典的13个面试题

经典的Shell十三问 1. 为何叫做shell?2. Shell prompt(PS1)与Carriage Return(CR)的关系?3. 别人echo, 你也echo, 是问echo知多少?4. ""(双引号)与(单引号)有什么区别?5. var=value? export前后差在哪?6. e

[转帖]shell脚本变量详解(自定义变量、环境变量、变量赋值、变量运算、变量内容替换)

https://developer.aliyun.com/article/885658 简介: shell变量 shell变量是指用一个特定的字符串去表示不固定的内容 1.变量的类型 1.1自定义变量 一般情况下不怎么使用环境变量,如果需要在其他文件中引入某个文件的变量则在脚本最开始的位置使用sou

[转帖]Shell脚本中利用expect实现非交互式

https://developer.aliyun.com/article/885723?spm=a2c6h.24874632.expert-profile.295.7c46cfe9h5DxWK 简介: expect非交互式 expect可以在脚本中完成一些交互式的操作,例如远程登录时要输入yes或者