Shell脚本攻略:数组

news/2024/11/3 1:27:50/

目录

一、理论

1.数组概述

2.定义数组

3.数组打印

 4.数组的数据类型及处理

5.数组赋值

6.数组遍历

7.数组切片

         8.数组替换

9.删除数组

10.追加数组中的元素

11.数组排序算法

二、实验

1.实验一

2.实验二

3.实验三


一、理论

1.数组概述

数组是Shell的一种特殊变量,是一组数据的集合,里面的每个数据被称为一个数组元素。

当前Bash仅支持一维索引数组和关联数组,Bash对数组的大小没有限制。

 

2.定义数组

(1)索引数组

       ① 方式一 

           数组名=(

            value0

            valuel

            value2

             …

             )

       ② 方式二 shell中,用小括号( )来表示数组,数组元素之间用空格来分隔

           数组名=(value0 valuel value2 …)

       ③ 方式三 采用键值对的形式赋值

           数组名=( [0]=value [1]=value [2]=value …)
       ④ 方式四 通过分别定义数组变量的方法来定义

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

       ⑤ 方式五

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

(2)备注

 ① 数组中的元素,必须以"空格"来隔开,这是其基本要求;

 ②  定义数组其索引,可以不按顺序来定义,比如说:names=([0]=Jerry [1]=Alice [2]=David [8]=Wendy);

 ③ 字符串是SHELL中最重要的数据类型,其也可通过($str)来转成数组,操作起来非常方便;

3.数组打印

(1)打印单个数组元素

         ${数组名[下标]} 。当未指定数组下标时,下标默认从0开始

(2)打印全部数组内容

         ${数组名[@]}或 ${数组名[*]}

(3)打印数组元素的个数

         ${#数组名[@]}或 ${#数组名[*]}

 4.数组的数据类型及处理

(1) 使用" "或‘ ’定义:

       数值类型
       ② 字符类型

(2)处理数组

      直接获取元素的值及数组的信息

       获取单个元素的值

echo ${array[0]}	#获取第一个元素的值
echo ${array[-1]}	#获取最后一个元素的值

获取所有元素的值

echo ${array[*]}	
echo ${array[@]}

统计数组的长度

echo ${#array[*]}


5.数组赋值

如果下标不存在,则自动添加一个新的元素;如果下标存在,则覆盖原来的值

6.数组遍历

(1)标准的for循环

(2)for … in循环方法

(3)While循环法

7.数组切片

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

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

 

8.数组替换

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

(1)临时替换

(2)永久替换

 (3)匹配替换

${array[@]/x/y}     最小匹配替换,每个元素只替换一次

${array[@]//x/y}    最大匹配替换,每个元素可替换多次

${array[@]/x/}      最小匹配删除,只删除一个符合规定的元素

${array[@]//x/}     最大匹配删除,可删除多个符合规定的元素

${array[@]/#x/y}     从左往右匹配替换,只替换每个元素最左边的字符

${array[@]/%x/y}     从右往左匹配替换,只替换每个元素最右边的字符

9.删除数组

(1)使用unset删除数组

(2)匹配删除

#  每个元素,从左向右进行最短匹配
## 每个元素,从左向右进行最长匹配
%  每个元素,从右向左进行最短匹配
%% 每个元素,从右向左进行最长匹配

10.追加数组中的元素

(1)+=,待添加元素必须用“()"包围起来,并且多个元素用空格分隔

(2)当数组的元素非常多的时候,可以直接使用数组的长度作为自己将要追加的索引的值,这样就可以直接追加元素了。
因为原始数组的索引是从0开始的,所以用长度减去1就是原始数组的最后的以为索引值了,
那么自己将要添加的值应该是原始索引值的后一位,那显然就等于数组的长度值了。

 (3)双引号不能省略,否则,当数组array中存在包含空格的元素时会按空格将元素拆分成多个。
不能将“@“替换为“*”,如果替换为"*",
不加双引号时与"@"的表现一致,加双引号时,会将数组array中的所有元素作为一个元素添加到数组中。
可以简单的理解为:用*号是作为一个整体,而用@还是单个的个体。

$*、$@不加双引号时表现一致;加双引号时,$*会将所有参数作为一个整体。 

11.数组排序算法

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

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

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

在实际应用中,冒泡排序适用于对小规模数据进行排序.

    ③  假设待排序序列为 (5,1,4,2,8),如果采用冒泡排序对其进行升序(由小到大)排序,则整个排序过程如下所示:
1) 第一轮排序,此时整个序列中的元素都位于待排序序列,依次扫描每对相邻的元素,并对顺序不正确的元素对交换位置,整个过程如下图所示。

2) 第二轮排序,此时待排序序列只包含前 4 个元素,依次扫描每对相邻元素,对顺序不正确的元素对交换位置,整个过程如下图所示。


3) 第三轮排序,此时待排序序列包含前 3 个元素,依次扫描每对相邻元素,对顺序不正确的元素对交换位置,整个过程如下图所示。

4) 第四轮排序,此时待排序序列包含前 2 个元素,对其进行冒泡排序的整个过程如下图所示。

5) 当进行第五轮冒泡排序时,由于待排序序列中仅剩 1 个元素,无论再进行相邻元素的比较,因此直接将其并入已排序序列中,此时的序列就认定为已排序好的序列。

二、实验

1.实验一

冒泡排序(升序)

(1)脚本截图

(2)运行结果

2.实验二

df -h命令查询磁盘空间使用率,去百分号并降序排序

(1)脚本截图

(2)运行结果

3.实验三

获取索引下标,实现数组每个值乘2

(1)脚本截图

(2)运行结果


http://www.ppmy.cn/news/144069.html

相关文章

Mybatis插件MyBatisCodeHelperPro使用

目录 MyBatisCodeHelperPro的安装(IDEA插件的两种安装方式) 通过IDEA连接MySQL数据库,方便后续的数据库操作 MyBatisCodeHelperPro的使用 1、新建项目工程测试 2、在pom文件中引入依赖(后面测试需要用到) 3、编写…

SREWorks v1.5 版本发布 | 基于实时作业平台的日志聚类开源

在经过v1.0~v1.4四个版本迭代后,SREWorks的核心底座已经表现出极高的稳定性和成熟性。在v1.5版本中,SREWorks开发团队在核心底座上,进行了较多的数智化能力迭代。同时,在数智能力迭代过程中,我们也维持着与SREWorks用户…

OpenMMLab-AI实战营第二期-课程笔记-Class 1:开营仪式OpenMMLab概述

Class 1:开营仪式&OpenMMLab概述 文章目录 Class 1:开营仪式&OpenMMLab概述开营仪式OpenMMLab 简介why?when?what?for who?OpenMMLab 总体框架 二十分钟入门计算机视觉开源神器OpenMMLabOpenMMLab概…

在spring容器启动后监听事件ApplicationReadyEvent

概述 经常会在业务中遇到需要在项目启动后刷新/预热一些数据的要求。 常见可以监听ApplicationReadyEvent和ContextRefreshedEvent. 但是因为常见的springboot项目都依赖的springmvc,所以实际上有2个容器,spring的ioc容器是springmvc的父容器。 而且C…

集权攻击系列:如何利用PAC新特性对抗黄金票据?

黄金票据简介 黄金票据是一种常见的域内权限维持手段,这种攻击主要是利用了Kerberos认证过程中TGT票据由KRBTGT用户的hash加密的特性,在掌握KRBTGT用户密码之后可以通过签发一张高权限用户的TGT票据,再利用这个TGT向KDC获取域内服务的ST来实…

dllreg解除服务器注册,最简单的修复IE浏览器的方法:注册表重新注册DLL

IE损坏,有修复技巧 我们在使用IE浏览器的过程中,有时候会遇到一些意想不到的事情,那就是突然IE失效了,或者明显不正常了。例如,点击链接但没有反应;在开始菜单的运行对话空中输入URL,但不能弹出…

ie浏览器怎么打开html,IE浏览器无法打开网页如何解决

在网络非常良好的情况下IE无法打开网页一定是让每个用户非常头痛,引起IE无法上网的原因是多种的,有可能是木马入侵绑架了IE浏览器,有可能是IE版本过旧,有可能是浏览器与插件不兼容,还有可能是网站的服务器压力过大也会…

手机浏览器服务器修复,手机IE浏览器怎么修复

手机已然成为我们生活中必备产品之一,自然手机浏览器的使用频率一样不低。很多时候,在我们手机有网络的情况下,我们可以通过手机浏览器帮助我们更方便的浏览一些网页。而导致我们手机浏览器打不开的原因有很多,我们可以通过以下方…