Shell之(数组)

目录

一、shell数组

1.数组的定义

2.定义数组的方法

第一种

 第二种

第三种 

第四种  

3.数组分片

4. 数组字符替换

临时替换 

永久替换 

5.删除数组  

 删除指定的下标

删除整组 

6.数组遍历和重新定义 

7.数组追加元素

方式一:指定位置添加

方法二: 末尾追加元素

方式三:进行末尾多元素追加

方法四:直接末尾追加多元素且格式最为简单 

8.用函数判断数组是否完整 

9. Shell向函数传数组参数

 10.Shell从函数返回数组 

二.数组排序算法(拓展)

1.冒泡排序

2.直接选择排序

3.反转排序


一、shell数组

1.数组的定义

由多个元素之间以空格分隔的元素组成
数组的元素可使用的数据类型可以是:数字 或 “字符串” / ’字符串‘;元素存在下标等于n-1.

2.定义数组的方

第一种
数组名=(值1  值2  值3  ... )以空格间隔,如果值为字符类型,需要加单引号或双引号
[root@localhost ~]# a=(1 2 3 4 5 6)
[root@localhost ~]# echo ${a[@]}
1 2 3 4 5 6
[root@localhost ~]# echo ${a[*]}       # @和*作用都一样查看数组全部
1 2 3 4 5 6
[root@localhost ~]# echo ${a[0]}       # 通过下标查看具体值
1
[root@localhost ~]# echo ${a[1]}
2
[root@localhost ~]# echo ${a[2]}
3
[root@localhost ~]# 

 查看下标

  • [root@localhost ~]# echo ${!a[*]}      # !显示下标
    0 1 2 3 4 5
    

获取元素长度

  • [root@localhost ~]# echo ${#a[*]}        # 添加#显示长度
    6


 第二种
 
2.数组名=([0]=值 [1]=值 [2]=值 ...)

第三种 
列表名="value0 value1 value2 ..."数组名=($列表名)

第四种  
数组名 [0]="value"数组名 [1]="value"数组名 [2]="value" 
echo ${z[*]}   #所有元素展开
echo ${#z[*]}  #查看长度
echo ${!z[*]}  #查看下标

 

3.数组分片

echo ${数组名[@]:下标:长度}echo ${数组名[*]:下标:长度}

echo ${z[*]:1:2}   2:保留几位1:从指定下标开始

4. 数组字符替换

临时替换,字符串替换而不是替换元素组内容

echo ${数组名[@]/旧字符/新字符}数组名=(${数组名[*]/旧字符/新字符})        通过重新定义的方式实现永久替换

 

临时替换 
echo ${数组名[*]/被替换的字符或字段/新的字符或字段} 

 

永久替换 
数组名=(${数组名[*]/旧字符/新字符})

5.删除数组  

根据下标删除某个下标和删除整个数组

unset 数组名[下标]                删除数组的某个下标unset 数组名                     删除数组

 删除指定的下标

 

删除整组 

6.数组遍历和重新定义 

zz=(2 4 6 8 10)
n=0
for i in ${zz[@]}
doarr[$n]=$[i*2]let n++
done

7.数组追加元素

方式一:指定位置添加
数组名[新下标]=新元素
方法二: 末尾追加元素
格式: 数组名[${#数组名[*]}] =新元素   或     数组名[${#数组名[@]}] =新元素

方式三:进行末尾多元素追加
数组名=("${数组名[@]}" 新元素1 新元素2 ....)
方法四:直接末尾追加多元素且格式最为简单 
数组名=("${数组名[@]}" 新元素1 新元素2 ....) 

8.用函数判断数组是否完整 

#!/bin/bash
#判断一个数组是否完整
array1=(10 20 30 40 50 60)
array3=([0]="a" [1]="b" [2]="c" [3]="d" [5]="f")#获取数组长度
length1=${#array1[@]}
length3=${#array3[@]}#获取长度n - 1 的下标
last1=$[length1 - 1]
last3=$[length3 - 1]#获取数组最后一个元素下标
last1_num=$(echo ${!array1[@]} | awk '{print $NF}')
last3_num=$(echo ${!array3[@]} | awk '{print $NF}')#判断长度n - 1 的下标 是否与 数组最后一个元素下标 相同
if [ $last1 -eq $last1_num ];thenecho "array1 数组完整"
elseecho "array1 数组不完整"
fiif [ $last3 -eq $last3_num ];thenecho "array3 数组完整"
elseecho "array3 数组不完整"
fi

 

函数名() {数组2=($@)         #在函数体内将传入的列表重新组成数组....
}函数名 ${数组1[@]}      #在函数体外将数组分解成列表传入

9. Shell向函数传数组参数

函数名() {数组2=($@)         #在函数体内将传入的列表重新组成数组....
}函数名 ${数组1[@]}      #在函数体外将数组分解成列表传入

 10.Shell从函数返回数组 

函数名(){....echo ${数组2[@]}     #在函数体内以列表形式返回值
}数组1=(函数名 参数)      #在函数体外将函数执行的结果重新组合成数组

 

二.数组排序算法(拓展)

1.冒泡排序

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

基本思想

冒泡排序的基本思想是对比相邻的两个元素值,如果满足条件就交换元素值,把较小的元素移动到

数组前面,把大的元素移动到数组后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部

 

算法思路

冒泡算法由双层循环实现,其中外部循环用于控制排序轮数,一般为要排序的数组长度减1次,因

为最后一次循环只剩下一个数组元素,不需要对比,同时数组已经完成排序了。而内部循环主要用

于对比数组中每个相邻元素的大小,以确定是否交换位置,对比和交换次数随排序轮数而减少

 

2.直接选择排序

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

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

实操 

3.反转排序

概述

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

基本思想

把数组最后一个元素与第一个元素替换,倒数第二个元素与第二个元素替换,以此类推,直到把所

有数组元素反转替换

实操↓

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

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

相关文章

AnyMP4 Video Converter for Mac/Win - 视频转换的卓越之选

在当今数字化的时代,视频内容无处不在,而拥有一款强大的视频转换器就显得至关重要。AnyMP4 Video Converter for Mac/win 正是这样一款出类拔萃的工具,为您带来高效、便捷的视频转换体验。 这款视频转换器具备令人惊叹的功能。它支持广泛的视…

GAME101-Lecture07学习

前言 今天主要讲shading(着色)。在讲着色前,要先讲图形中三角形出现遮挡问题的方法(深度缓存或缓冲)。 先采样再模糊错误:对信号的频谱进行翻译(在这期间会有频谱的混叠)&#xff…

【ARMv8/v9 系统寄存器 5 -- ARMv8 Cache 控制寄存器 SCTRL_EL1 使用详细介绍】

关于ARM Cache 详细学习推荐专栏: 【ARM Cache 专栏】 【ARM ACE Bus 与 Cache 专栏】 文章目录 ARMv8/v9 Cache 设置寄存器ARMv8 指令 Cache 使能函数测试代码 ARMv8/v9 Cache 设置寄存器 关于寄存器SCTRL_EL1 的详细介绍见文章:【ARMv8/v9 异常模型入…

char x[]---char*---string---sizeof

字符串数组 #include <iostream>int main(){char c_str[]"abcd";char c_str1[]{a,b,c,d};std::cout<<sizeof(c_str)<<std::endl;std::cout<<sizeof(c_str1)<<std::endl;return 0; } char*存储的字符串个数 char*字符串所占字节大小 c…

洛谷P1364 医院设置

P1364 医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c…

【计算机毕业设计】springboot二手家电管理平台

时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;二手家电管理平台当然不能排除在外。二手家电管理平台是在实际应用和 软件工程的开发原理之上&#xff0c;运用java语言以及前台VUE框架&#xf…

【操作系统期末速成】​内存管理|内存的装入模块在装入内存的方式|分配管理方式|页面置换算法|页面置换

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;操作系统&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到…

每周一算法:恰好经过K条边的最短路

题目描述 牛站 给定一张由 M M M 条边构成的无向图&#xff0c;点的编号为 1 ∼ 1000 1\sim 1000 1∼1000 之间的整数。 求从起点 S S S 到终点 E E E 恰好经过 K K K 条边&#xff08;可以重复经过&#xff09;的最短路。 注意: 数据保证一定有解。 输入格式 第 1 …

万字长文破解 AI 图片生成算法-Stable diffusion (第一篇)

想象一下&#xff1a;你闭上眼睛&#xff0c;脑海中构思一个场景&#xff0c;用简短的语言描述出来&#xff0c;然后“啪”的一声&#xff0c;一张栩栩如生的图片就出现在你眼前。这不再是科幻小说里才有的情节&#xff0c;而是Stable Diffusion——一种前沿的AI图片生成算法—…

「AIGC」Python实现tokens算法

本文主要介绍通过python实现tokens统计,避免重复调用openai等官方api,开源节流。 一、设计思路 初始化tokenizer使用tokenizer将文本转换为tokens计算token的数量二、业务场景 2.1 首次加载依赖 2.2 执行业务逻辑 三、核心代码 from transformers import AutoTokenizer imp…

半小时搞懂STM32知识点——UART

1.UART 1.1为什么要使用UART这种协议?介绍一下UART及其特点 成本低&#xff0c;硬件简单&#xff0c;数据格式灵活&#xff1b; 低速全双工异步串行通信 1.2 UART数据帧格式&#xff1f; 起始位&#xff08;1&#xff09;&#xff0b;数据位&#xff08;5-8&#xff09; 校验位…

C语言详解:数组指针

数组指针是指针 int* p[10] 这是指针数组的写法 &#xff0c;因为【】的优先级比*高&#xff0c; 所以为了解决优先级问题&#xff0c;加&#xff08;&#xff09; int(* p)[10]&arr;//数组的地址要存起来 说明p是指针&#xff08;首先与*结合&#xff09;&#xff0c…