一文教你学会Linux数组

news2024/12/23 15:25:44

目录

🎀什么是数组?

🎀数组优点

🎀数组缺点

🎀定义数组  

🎀数组的取值

🎀一次取出数组所有的值

🎀数组长度: 即数组元素个数

🎀数组的截取(分片)(切片)

🎀连接数组

🎀替换元素


什么是数组?

数组是一种特殊的数据结构,其中的每一项被称为一个元素,对于每个元素,都可以用索引的方式取出元素的值。使用数组的典型场景是一次性要记录很多类型相同的数据时(但不一定必须要相同)。比如,为了记录班级中所有人的数学成绩,如果不用数据来处理,那就只能定义所有人成绩的变量。shell 中的数组对元素个数没有限制,但只支持一维数组。

数组优点

  1. 高效的数据访问:数组的元素在内存中是连续存储的,因此可以通过索引快速访问和修改元素。这使得数组在需要频繁访问元素的操作中非常高效,例如遍历、查找和排序等。

  2. 内存的局部性:由于数组的元素在内存中是连续存储的,当访问一个元素时,相邻元素通常也会被缓存到CPU的缓存中。这种局部性可以提高数据的访问效率,减少缓存失效带来的性能损失。

  3. 多维数据结构:数组可以很容易地表示多维数据结构,例如矩阵或图像。这使得数组在科学计算、图像处理和机器学习等领域中得到广泛应用。

  4. 高效的算法:很多经典算法和数据结构都是基于数组实现的,例如排序算法(如快速排序和归并排序)和搜索算法(如二分搜索和深度优先搜索)。这些算法通常具有高效的时间和空间复杂度,能够处理大规模数据。

  5. 灵活的动态大小:数组的大小可以在运行时动态调整,可以根据需要增加或减少元素的个数。这使得数组适用于动态的数据管理,无需提前指定大小,可以根据实际需求进行调整。

总的来说,数组是一种高效、灵活且功能强大的数据结构,能够满足许多不同场景下的数据存储和操作需求

数组缺点

  1. 固定大小:数组在创建时需要指定固定的大小,一旦创建后,其大小无法动态改变。如果需要存储的元素数量超过了数组的初始大小,就需要重新创建一个更大的数组,并将原数组的数据复制到新数组中。这种操作可能会导致内存的重新分配和数据复制的开销,影响性能。

  2. 插入和删除元素开销大:由于数组的大小固定,当需要在数组中插入或删除元素时,需要移动其他元素来腾出或填补空间。插入和删除操作的时间复杂度通常为O(n),其中n是数组中的元素数量。在频繁执行插入和删除操作的情况下,数组可能不是最优的选择。

  3. 浪费内存空间:由于数组需要预分配一定的内存空间,当实际存储的元素数量远小于数组的大小时,会造成内存空间的浪费。这种情况在需要处理动态变化的数据时特别明显,比如在开始时不知道需要存储多少元素,或者需要频繁地添加和删除元素。

  4. 不适合非连续数据存储:数组的元素在内存中是连续存储的,这样的特性使得它对于非连续数据的存储不太适合。当需要存储稀疏数据或非线性数据结构(如树或图)时,数组的优势将不再明显,可能需要选择其他数据结构来更好地表示这些数据。

综上所述,虽然数组是一种常用的数据结构,但它也有一些局限性,特别是在动态数据管理和元素插入/删除等操作方面。在实际应用中,根据具体需求和场景,需要权衡数组的优点和缺点,选择合适的数据结构来进行数据存储和操作

定义数组  

使用 declare 命令定义数组
[root@localhost shell]# declare -a List
[root@localhost shell]# List[0]=Tom
[root@localhost shell]# List[1]=Jerry
[root@localhost shell]# List[2]=Dog
[root@localhost shell]# echo ${List[0]}
Tom
[root@localhost shell]# echo ${List[1]}
Jerry
[root@localhost shell]# echo ${List[2]}
Dog
[root@localhost shell]# 
        当然,也可以在创建数组的同时赋值,declare -a也可以省略不写
[root@localhost shell]# Name=("zhangsan" "li si" "wang wu")
[root@localhost shell]# echo ${Name[0]}
zhangsan
[root@localhost shell]# echo ${Name[1]}
li si
[root@localhost shell]# echo ${Name[2]}
wang wu
[root@localhost shell]# echo ${Name[-1]}
wang wu
[root@localhost shell]# echo ${Name[-2]}
li si
[root@localhost shell]# echo ${Name[-3]}
zhangsan
[root@localhost shell]# 
      注意数组多个元素之间,不要用符号,否则会把多个元素当做整体一起输出
[root@localhost shell]# name=("zhangsan","li si","wang wu")
[root@localhost shell]# echo $name
zhangsan,li si,wang wu
[root@localhost shell]# echo ${name[0]}
zhangsan,li si,wang wu
[root@localhost shell]# echo ${name[1]}

[root@localhost shell]# 
      还可以使用跳号赋值,也就是说可以指定索引号
[root@localhost shell]# Score=([3]=3 [5]=5 [7]=7)
[root@localhost shell]# echo ${Score[3]}
3
[root@localhost shell]# echo ${Score[5]}
5
[root@localhost shell]# echo ${Score[7]}
7
[root@localhost shell]# 

数组的取值

数组取值:格式为: ${ 数组名 [ 索引 ]}
默认显示数字第一个元素值
[root@localhost shell]# echo ${Name[0]}
zhangsan
[root@localhost shell]# echo ${Name}
zhangsan
[root@localhost shell]# 
取出对应索引下标的值
[root@localhost shell]# echo ${Name[2]}
wang wu
[root@localhost shell]# echo ${Name[1]}
li si
[root@localhost shell]# echo ${Name[0]}
zhangsan
[root@localhost shell]# 
注意的是,数组内索引为0 的才是第一个

一次取出数组所有的值

得到的是以空格隔开的元素

[root@localhost shell]# echo ${Name[@]}
zhangsan li si wang wu
[root@localhost shell]# 

* //得到的是一整个字符串

echo ${Name[*]}

数组长度: 即数组元素个数

利用 “@” “*” 字符,可以将数组扩展成列表,然后使用 “#” 来获取数组元素的个数
[root@localhost shell]# echo ${#Name[*]}
3
[root@localhost shell]# echo ${#Name[@]}
3
[root@localhost shell]# 

数组的截取(分片)(切片)

可以截取某个元素的一部分,对象可以是整个数组或某个元素。(数组的切片:右不包括行为)
定义数组
[root@localhost shell]# Number=(1 2 3 4 5 6 7 8)
[root@localhost shell]# echo ${Number[*]}
1 2 3 4 5 6 7 8
[root@localhost shell]# echo ${#Number[*]}
8
[root@localhost shell]# 
/ 取出第一个到第 3 个元素的值
[root@localhost shell]# echo ${Number[@]:0:3}
1 2 3
/ 取出第 3 个到第6个元素的值
[root@localhost shell]# echo ${Number[@]:2:4}
3 4 5 6
PS: 到这里,同学们可能就会有点懵了,需要大家注意的是,数组分片的书
写格式的意义表示: 从第几个开始连续出现几个字符。
//
也可以取出某个元素的第几个开始到第 n 个字符
root@localhost shell]# Word=(hello world and welcome)
[root@localhost shell]# echo ${Word[2]:0:3}
and
[root@localhost shell]# echo ${Word[1]:0:3}
wor
[root@localhost shell]# echo ${Word[1]:0:4}
worl
[root@localhost shell]#

连接数组

将若干个数组进行拼接操作
[root@localhost shell]# echo ${Number[@]}
1 2 3 4 5 6 7 8
[root@localhost shell]# echo ${Word[@]}
hello world and welcome
[root@localhost shell]# 
将两个数组的元素全部连接
[root@localhost shell]# NewNum=(${Number[@]} ${Word[@]})
[root@localhost shell]# echo $NewNum
1
[root@localhost shell]# 
[root@localhost shell]# echo ${NewNum[@]}
1 2 3 4 5 6 7 8 hello world and welcome
[root@localhost shell]#
那么现在我们重组新的数组,截取 Word 数组的第 2 个元素从第 0 个连续 5个字符,和Number 数组里的第 2 个字符开始连续 3 个字符
[root@localhost shell]# New=(${Word[2]:0:5} ${Number[@]:1:3})
[root@localhost shell]# echo ${New[@]}
and 2 3 4
[root@localhost shell]# 

替换元素

将数组内某个元素的值替换成其他值。如果匹配不到则没有改动

[root@localhost shell]# Name=(zhangsan lisi wangwu zhaoliu)
[root@localhost shell]# echo ${Name[@]}
[root@localhost shell]# echo ${Name[@]}
zhangsan lisi wangwu zhaoliu
//将lisi替换为lilei
[root@localhost shell]# Name=(${Name[@]/lisi/lilei})
[root@localhost shell]# echo ${Name[@]}
zhangsan lilei wangwu zhaoliu
//将zhaoliu替换为zhaosi
[root@localhost shell]# Name=(${Name[@]/zhaoliu/zhaosi})
[root@localhost shell]# echo ${Name[@]}
zhangsan lilei wangwu zhaosi
上边的写法可以达到要求,但较为复杂,其实可以完全按照 变量 重新赋值的方式,直接写数组的对应的元素的值。比如,上述例子中将zhangsan改为 wukong ,就可以简化为
[root@losthost ~]# Name[0]=wukong
[root@losthost ~]# echo ${Name[@]}
wukong lilei wangwu zhaosi
取消数组或元素
使用 unset 命令,取消数组中的一个元素
[root@losthost shell]# unset Name[2]
[root@losthostshell]# echo ${Name[@]}
zhangsan lilei zhaosi
取消整个数组 ,= 取消变量全部
[root@losthost shell]# unset Name
[root@losthost shell]# echo ${Name[@]}

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

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

相关文章

【ASP.NET】医学实验室管理(LIS)系统源码

一、医学实验室LIS系统概况 LIS(全称Laboratory Information Management System),是专为医院检验科设计的一套实验室信息管理系统,能将实验仪器与计算机组成网络,使病人样品登录、实验数据存取、报告审核、打印分发&am…

MySQL数据库的索引原理与慢SQL优化的5大原则

这篇文章主要介绍了MySQL数据库的索引原理与慢SQL优化的5大原则,包括:建立索引的原则,慢查询优化基本步骤,慢查询优化案例,explain使用,需要的朋友可以参考下 我们知道一般的应用系统,读写比例在10:1左右&…

计算机系统结构与操作系统实验三(2)-进入保护模式

📍实验要求 从实模式到保护模式的转变: 在刚进入loader尚在实模式下时,在第2行显示:real-Zhangsan 在变为保护模式后,在第3行显示:protect-Zhangsan 加载gdt、将cr0的PE位置为1 📍实验过程 老…

建议收藏 | 可视化ETL平台--Kettle

Kettle的介绍 学习目标 知道什么是ETL及Kettel是开源的ETL工具 了解kettle环境的安装流程 1.ETL介绍 ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程),对于企业或行业应用来说,我们经常会遇到各种…

redis可视化工具 Another Redis Desktop Manager

Redis API 官方文档:Redis 命令参考 — Redis 命令参考 Redis 可视化工具下载: Releases qishibo/AnotherRedisDesktopManager GitHub(github) 使用: 1、新建连接 点击 新建连接 创建新的连接 切换语言 地址&a…

前端Vue自定义商品订单星级评分 爱心评分组件

随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现…

数据分类分级的概念、方法、标准及行业实践

数据战略上升为国家战略,数据资产成为国家各行各业的核心资产。在数字化时代,数据分类分级成为数据资产管理的重要组成部分。 通过数据分类分级管理,可有效使用和保护数据,使数据更易于定位和检索,满足数据风险管理、…

领略大数据分析的魅力:迈向FineBI的世界

版权声明:本文为 小异常 原创文章,非商用自由转载-保持署名-注明出处,谢谢! 本文网址:https://sunkuan.blog.csdn.net/article/details/131698171 文章目录 一、FineBI介绍(6.0版本)1、使用人群…

高并发的哲学原理(三)-- 基础设施并发:虚拟机与 Kubernetes(k8s)

上篇文章说到,Apache 无法处理海量用户的 TCP 连接,那要是由于宇宙时空所限,你的系统就是无法离开 Apache,该怎么承接高并发呢?有办法:既然单机不行,那就把单机虚拟化成多个 Linux 机器&#xf…

关于typescript的类型推断一些理解

我们先看一段代码: interface defaultObjType {[key: string]: any; } interface SquareConfig {color?: string | defaultObjType;width?: number; } let obj:SquareConfig {color: {qw:123}, }if(obj.color && obj.color.qw) { // 这里报错&#xff…

【重要】MThings V0.6.0更新要点

我们听到了您的声音并采取了行动!现在为您提供了一次全面的软件升级,让您的体验更加顺畅、稳定和安全。立即更新,畅享新功能! 下载地址: http://gulink.cn/download 01. [新增]支持系统数据、历史数据、告警功能个人版…

Liunx命令大全及基础知识扫盲

文章目录 1,ifconfig命令2,ens10和eth103,查看PCI地址 1,到达最后一行 ctrl end 1,ifconfig命令 ifconfig 是一个用于配置和显示网络接口信息的命令行工具 1,ifconfig这将显示所有网络接口的详细信息,包括接口名称、MAC 地址、IP 地址、子…

2023中国企业绿电国际峰会

会议时间/地点/主办方 2023年11月16-17日,中国上海,ECV International 会议形式 峰会采用“线下线上”的方式同步进行,中英双语同声传译,线上、线下并行进行和实时互动。 峰会背景 当下全球气候问题正在不断显现,对…

conda修改环境保存地址

可以在命令行中通过conda config指令进行修改 如: 添加环境目录envs_dirs conda config --add envs_dirs F:\conda_env\envs 添加pkgs_dirs conda config --add pkgs_dirs F:\conda_env\pkgs 也可以直接进入Anaconda Nacigator进行修改

Java反序列化:URLDNS的反序列化调试分析

URLDNS链子是Java反序列化分析的第0课,网上也有很多优质的分析文章。 笔者作为Java安全初学者,也从0到1调试了一遍,现在给出调试笔记。 一. Java反序列化前置知识 Java原生链序列化:利用Java.io.ObjectInputStream对象输出流的w…

Openlayers实战:加载OpenStreetMap(快速显示无加载不出状态)

Openlayers官方一直演示的都是用Openstreetmap, 但是目前国内使用通用的new OSM(), 是加载不出来OSM地图的。在我们的实战中代码中,不但能够加载出Openstreetmap, 而且速度非常的快,这就涉及到一个曲线救图的处理方式,请参考源代码。 效果图 源代码 /* * @Author: 大剑师…

如何提取音频中的纯人声?分享三个方法给大家!

在处理音频文件时,有时候我们只希望提取其中的纯人声,以便进行后续处理或编辑。本文将介绍三种简单有效的方法,帮助您提取音频中的纯人声。方法一使用记灵在线工具,方法二使用Audacity,方法三则为您补充其他可选方案。…

Linux—实操篇:实用指令

目录 1、指定运行级别 1.1基本介绍 1.2、示例 1.3、CentOS7 后运行级别说明 2、找回root密码 3、帮助指令 3.1、man指令 3.2、help指令 4、文件目录指令 4.1、pwd 指令 4.2、ls 指令 4.3、cd 指令 4.4、mkdir 指令 4.5、rmdir 指令 4.6、touch 指令 4.7、cp 指…

Unified Named Entity Recognition as Word-Word Relation Classification

原文链接:https://arxiv.org/pdf/2112.10070.pdf AAAI 2022 介绍 NER主要包括三种类型:flat、overlap和discontinuous。目前效果最好的模型主要是:span-based和seq2seq,但前者注重于边界的识别,后者可能存在exposure b…

保护用户数据隐私:Web3 技术在电商行业中的应用

电商行业一直是全球经济发展的重要推动力。然而,随着电商行业的不断发展,中心化的支付、物流和数据存储方式逐渐暴露出安全隐患和隐私问题。这时,Web3 技术以其去中心化、安全性和透明性等特点,为电商行业带来了新的解决方案和可能…