Shell脚本之数组

数组

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

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

如果数组中有三个参数:1 2 3
运行数组脚本后
"$*" 为 “1 2 3” (作为一个整体使用)
"$@" 为“1” “2” “3” (分别作为单个的个体使用)
"$#" 为3 (表示参数的数量,也可以叫做长度)

不加双引号时与"@"的表现一致,加双引号时,会将数组arr1中的所有元素作为一个元素添加到数组中。
可以简单的理解为:用*号是作为一个整体,而用@还是单个的个体。

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

数组定义方法

方法一:

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

 方法二:

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

方法三:

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

方法四: 

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

 举例

 数组包括的数据类型

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

 获取数组长度

读取某下标赋值

数组遍历 

#!/bin/bash
arr5=(1 2 3 4 5)
for i in ${arr5[*]}
doecho $i
done

数组切片

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

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

数组替换

永久替换

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

删除数组 

使用unset删除数组

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

 追加数组中的元素

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

从函数返回数组 

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

加法传参运算

#!/bin/bash
test2 () {abc1=(`echo $@`)sum=0for i in ${abc1[*]}dosum=$[$sum + $i]doneecho "$sum"
}abc=(33 66 99 77 55)test2 ${abc[*]}

 乘法传参运算

#!/bin/bash
test3 () {abc1=(`echo $@`)sum=0for ((i=0;i<=$[$# - 1];i++)) #是原始数组的元素个数,这里是取出新数组的>
索引值,不减的话就是一个字符串doabc1[$i]=$[${abc1[$i]} * 2] #这里是将每个原始索引对应的元素值乘以2传到新的数组中对应的索引的元素中去doneecho "${abc1[*]}"    #输出新的数组
}abc=(33 66 99 77 55)test3 ${abc[*]}

数组排序算法

冒泡排序

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

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

算法思路:

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

#!/bin/bash
abc=(33 66 99 44 37)          #定义一个数组
echo "原数组的排列顺序为:${abc[*]}"
length=${#abc[*]}                #定义原数组的长度为length变量
for ((i=1;i<$length;i++))        #定义排序轮次
dofor ((k=0;k<$length-i;k++))    #确定第一个元素的索引位置dofirst=${abc[$k]}            #定义第一个元素的值j=$[$k+1]                   #定义第二个元素的索引号second=${abc[$j]}          #定义第二个元素的值if [ $first -gt $second ]   #第一个元素和第二个元素比较,如果第一个元素比第二个元素大则互换thentemp=$first              #把第一个元素的值保存在临时变量temp中abc[$k]=$second         #把第二个元素的值赋给第一个元素abc[$j]=$temp           #把原第一个元素的值,赋给第二个元素fidone
doneecho "排序后数组的排列顺序为${abc[*]}"       #输出排序后的数组

直接选择排序 

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

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

#!/bin/bash
abc=(33 99 77 1024 556 66)               #定义一个数组
echo "原数组的排列顺序为${abc[*]}"
length=${#abc[*]}                   #定义原数组的长度,这里原数组的长度为6for ((i=1;i<$length;i++))           #这里是定义比较的轮数,比较5次
doindex=0                             #表示从索引0开始比较for ((k=1;k<=$length-i;k++))         #这里是确定用于比较的第一个元素的索引范围,比如已经定义了从索
引0开始了,所以和0进行比较的范围就是从索引1-5了dofirst=${abc[$k]}                  #定义与index相比较的索引的取值为firstif [ $first -gt ${abc[$index]} ]   #通过将index所在的索引的值与k所在的索引的值进行比较,获取最大
元素的索引位置thenindex=$k#通过比较将较大的数定义到index中,进行下一轮的比较filast=$[$length-$i]              #获取在比较的范围中的最后一个元素的索引temp=${abc[$last]}              #将上一步获取到的最后一个元素的索引的值保存到临时变量temp中abc[$last]=${abc[$index]}       #把最大上面for循环比较出来的最大元素的值赋值给最后一个元素abc[$index]=$temp               #把原来最后一个元素的值赋给原来最大值的位置的元素done
doneecho "排序后数组的排列顺序为${abc[*]}"   #输出排序后的数组

反转排序

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

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

#!/bin/bash
abc=(33 99 lol 77 wegame 1024 6 hello 59)
len=${#abc[*]}
echo "原来的数组排列顺序是:${abc[*]}"
for ((i=0;i<$len/2;i++))
dotemp=${abc[$i]}abc[$i]=${abc[$len-$i-1]}abc[$len-$i-1]=$temp
doneecho "反转后数组的排列顺序是:${abc[*]}"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue布局设置——使用 el-drawer 打造个性化 Admin 后台布局设置

在前端开发中&#xff0c;我们常常需要为 admin 后台构建灵活且个性化的布局设置。今天&#xff0c;我要分享的是如何利用 el-drawer 来实现这样一个有趣的功能。 首先&#xff0c;我们来看一下主要的设置参数&#xff1a; 1. theme: 用于定义主题&#xff0c;可以根据需求切换…

【已解决】attributeerror: ‘FreeTypeFont‘ object has no attribute ‘getsize‘

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

ctfshow web入门 phpCVE web312web314

web311 web312 IMAP协议&#xff08;因特网消息访问协议&#xff09;它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息&#xff0c;下载邮件等。它运行在TCP/IP协议之上&#xff0c;使用的端口是143&#xff0c;在php中调用的是imap_open函数来实现功能…

学习java

在实验室看见这本书&#xff0c;无聊看了下&#xff0c;写出了第一个java代码 成功下载了eclipse并且汉化。 写了自己的第一个java程序&#xff1a; package ttttt;public class ttttt {public static void main(String[] args) {System.out.println("hello world")…

Unreal自定义字体中,缺少字怎么办,有没有字表?

关键词&#xff1a;自定义字体&#xff0c;字表&#xff0c;编码&#xff0c;UTF-8,4E00-9FFF,4E00-9FA5,字符查重&#xff0c;字符唯一&#xff0c; 问题&#xff1a; 游戏中经常要自定义字体&#xff0c; 自定义字体往往要做离线字库 offline fonts 离线字库 离不开字符表。…

调味品企业的销量增长秘诀:五丰黎红引领大厨革新之路

随着时代的发展和消费升级&#xff0c;调味品行业的竞争愈发激烈&#xff0c;在此大环境之下&#xff0c;企业需要不断寻找创新的突破点来实现销量的增长。众所周知&#xff0c;调味品行业的销售渠道主要有餐饮、家庭消费和食品加工&#xff0c;按销售额的占比约为6&#xff1a…

[JAVASE] 类和对象(二)(续篇)

目录 一. static 修饰成员方法 1.1 基本使用 1.2 注意事项 (重点) 1.2.1 1.2.1 二. 代码块 2.1 代码块的分类及使用 2.1.1 静态代码块 2.1.2 实例代码块 2.1.3 普通代码块 2.2 代码块的执行顺序 三. 对象的打印 3.1 打印对象的引用 3.2 重写 toString 方法 四. 总结 一…

idea上如何新建git分支

当前项目在dev分支&#xff0c;如果想在新分支上开发代码&#xff0c;如何新建一个分支呢&#xff1f;5秒搞定~ 1、工具类选择git&#xff0c;点击New Branch 或者右下角点击git分支&#xff0c;再点击New Branch 2、在弹出的Create New Branch弹窗中&#xff0c;输入你的新分支…

el-table组件选中后使用toggleRowSelection无法取消已选中的数据——bug记录-骚操作解决

先说本文重点解决的问题&#xff1a; 存在的问题&#xff1a;当右侧已选中的数据中&#xff0c;删除了左侧其他页面的数据&#xff0c;但是左侧数据切换到其他页面后&#xff0c;左侧还保留选中的状态。 最近在写后台管理系统的时候&#xff0c;遇到一个需求&#xff1a; 左…

linux性能监控之lsof

lsof&#xff1a;list open files&#xff0c;显示所有打开的文件以及进程信息&#xff0c;我们通常用来检查特定的文件被哪些进程打开 [rootk8s-master ~]# lsof --help lsof: illegal option character: - lsof: -e not followed by a file system path: "lp" lso…

网络工程师----第二十七天

计算机基 第四章&#xff1a;网络层 网络层提供服务的特点&#xff1a;网络层向上只提供简单的、无连接的、尽最大努力交付的数据报服务&#xff0c;不保证可靠通信。 网际协议IP&#xff1a; *地址解析协议ARP(Address Resolution Protocol) *网际控制报文协议ICMP(Inter…

长图拼接技巧大揭秘:轻松实现横向拼接,一键批量处理方法

在数字化时代&#xff0c;我们经常会遇到需要将多张图片拼接成一张长图的情况&#xff0c;无论是用于制作海报、展示报告&#xff0c;还是制作社交媒体上的长图故事&#xff0c;掌握长图拼接的技巧都显得尤为重要。本文将为大家揭秘长图拼接的实用技巧&#xff0c;并介绍办公提…

React脚手架,配置环境变量(生产模式,开发模式)

项目搭建方式&#xff1a;react脚手架(create-react-app) 1. 下载依赖&#xff1a; npm install dotenv npm install dotenv-expandnpm install dotenv-cli -S 2.配置环境变量&#xff1a; 项目根部录下创建文件.env .env.pro .env.dev 配置package.json - scripts…

群晖 Synology DSM7 过热关机解决方法

最近已经提示我过热关机过两次了&#xff0c;这两次一次是用虚拟机&#xff0c;一次是批量使用Synology Photos批量上传照片&#xff1a; 但是我没有对主机进行任何的位置移动以及硬件修改操作&#xff0c;散热环境没有发生变化。以前使用从来没有出现过这个问题&#xff0c;同…

聚水潭和金蝶云星空单据接口对接

聚水潭和金蝶云星空单据接口对接 对接系统&#xff1a;金蝶云星空 金蝶K/3Cloud&#xff08;金蝶云星空&#xff09;是移动互联网时代的新型ERP&#xff0c;是基于WEB2.0与云技术的新时代企业管理服务平台。金蝶K/3Cloud围绕着“生态、人人、体验”&#xff0c;旨在帮助企业打造…

自集成式 HTTP 代理方案

前言 大部分程序员&#xff0c;想必都会有一个常用的抓包代理工具&#xff1b; 但在座的各位&#xff0c;可曾见过这样一款集成在 Web 应用中的代理工具&#xff1f; ​&#xff0c;时长00:45 它是明显区别于传统代理工具的&#xff0c;有以下特性&#xff1a; 零安装、零配…

解析流中 apts 与 vpts的分布

流中 apts 与 vpts的分布情况&#xff0c;同时使用图显示出来 一&#xff0c;最好的方式是使用EasyICE 来查看&#xff0c;这个自动化工具是很好用的&#xff1a; 二&#xff0c; 当EasyICE不能打出理想的数据的时候&#xff0c;可以自己来提取数据&#xff0c;画出对应的图&a…

tomcat--安装

官网&#xff1a;Apache Tomcat - Welcome! 官网文档&#xff1a;Apache Tomcat 8 (8.5.100) - Documentation Index 帮助文档&#xff1a;Apache Tomcat Home - Apache Tomcat - Apache Software Foundation FAQ - Apache Tomcat - Apache Software Foundation yum安装 查…

OpenNJet:引领下一代云原生应用引擎

文章目录 一、前言二、什么是OpenNJet 应用引擎三、OpenNJet的优势3.1 性能无损动态配置3.2 灵活的CoPilot框架3.3 支持HTTP/33.4 支持国密3.5 企业级应用3.6 高效安全 四、centos 安装4.1 生成njet.repo4.2 更新yum 缓存4.3 安装 njet 或 njet-otel 五、OpenNJet配置与部署5.1…

岩土工程监测仪器之一:振弦采集仪的工作原理解析

岩土工程监测仪器之一&#xff1a;振弦采集仪的工作原理解析 河北稳控科技振弦采集仪是岩土工程监测中常用的一种仪器&#xff0c;用于测量地面、结构物或其他物体的振动情况。它通过感应振弦的振动来获取相关的数据&#xff0c;进而分析和评估土壤、地基或结构物的稳定性和安…