当前位置: 首页 > news >正文

Linex操作系统-Shell脚本(四)

六、Shell中的数组

6.1 Shell数组的概念

数组是若干数据的集合,其中存放的每一份数据都称为元素。Shell不限制数组的大小,理论上可以存放无限量的数据,Shell数组元素的下标也是从0开始计数

获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;下标必须大于等于0

6.2 Shell数组的定义

6.2.1 数组的基本定义

在shell中,用小括号()来表示数组,数组元素之间用空格来分割

#arrayname=(1 2 3 4 5)
`输出定义数组中的全部元素
#echo ${arrayname[*]}
#echo ${arrayname[@]}
`输出定义数组中的第二个元素
#echo ${arrayname[0]}
`输出定义数组中的第二个元素
#echo ${arrayname[1]}
`输出定义数组中的元素个数
#echo ${#arrayname[*]}

6.2.2 采用键值对的方式赋值

在shell中用小括号将变量括起来,同时采用键值对的形式赋值

#array2=([1]=one [2]=two [3]=three)
echo ${array2[*]} #输出定义数组的所有元素
echo ${array2[@]} #输出定义数组的所有元素
echo ${#array2[@]} #输出定义数组的元素个数

6.2.3 通过定义数组变量的方法来定义

#array3[1]=a
#array3[2]=b
#array3[3]=c
`输出定义数组中的全部元素
echo ${array3[@]}
`输出定义数组中的第一个元素
echo ${array3[1]}

6.2.4 动态定义数组数量

动态的定义数组变量,并使用命令的输出结果作为数组的内容

# mkdir -p /array
# touch /array/{1..5}.txt
# ls /array
# array4=($(ls /array))
# echo ${array4[*]}
# echo ${array4[@]}
# echo ${#array4[*]}

6.3 Shell数组的打印

打印单个数组元素: ${数组名[下标]} 。当未指定数组下标时,下标默认从0开始

打印全部数组内容:${数组名[@]}或 ${数组名[*]}

打印数组元素的个数:${#数组名[@]}或 ${#数组名[*]}

6.4 Shell数组的赋值

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

6.5 Shell数组的拼接合并

所谓Shell数组的拼接合并,就是将两个数组连接成一个数组

拼接数组的思路是:先利用@或者*,将数组扩展成列表,然后再合并到一起

array_new=(${array1[@]} ${array2[@]})
array_new=(${array1[*]} ${array2[*]})
`两种方式是等价的,选择其一即可。其中,array1 和 array2 是需要拼接的数组,array_new 是拼接后形成的新数组。

6.6 Shell删除数组元素

使用unset关键字可删除数组元素

unset array_name[index]
`其中,array_name表示数组名,index表示数组下标unset array_name 
`删除整个数组

6.7 获取数组某范围的元素

在Shell中直接通过${数组名[@/*]:起始位置:长度}获取数组给定范围内元素,返回字符串,中间用空格分开

#!/bin/bash
array=(yoona lucy tom)
echo ${array[*]}
echo ${array[*]:1:2}
echo ${array[@]:0:2}
-->结果为:
yoona lucy tom
lucy tom
yoona lucy

6.8 数组元素的替换

${数组名[@/#]/查找字符/替换字符}该操作不会改变原先数组内容,如果需要修改,使用覆盖

#!/bin/bash
array=(yoona lucy tom)
echo ${array[@]/lucy/lily}
echo ${array[*]}--->结果为:
yoona lily tom
yoona lucy tom

6.9 关联数组

Bash支持关联数组,它可以使用字符串作为数组索引,有时候采用字符串索引更容易理解

6.9.1 定义关联数组

首先需要使用声明语句declare将一个变量声明为关联数组

# declare -A assArray

声明后,有两种方法可以添加到关联数组中

1.利用内嵌索引-值列表的方法

# assArray=([lucy]=beijing [yoona]=shanghai)
# echo ${assArray[lucy]}--->结果为:
beijing

  2.使用独立的索引-值进行赋值

# assArray[lily]=shandong
# assArray[sunny]=xian
# echo ${assArray[sunny]}
-->结果为:xian

6.9.2 列出数组索引

每一个数组都有一个索引用于查找。使用${!数组名[@/*]}获取数组的索引列表

# echo ${!assArray[*]}
# echo ${!assArray[@]}

6.9.3 获取所有键值对

#! /bin/bash
declare -A cityArray
cityArray=([yoona]=beijing [lucy]=shanghai [lily]=shandong)
for key in ${!cityArray[*]}
doecho "${key} come from ${cityArray[$key]}"
done--->结果为:
lily come from shandong
yoona come from beijing
lucy come from shanghai

6.10 mapfile命令

6.10.1 mapfile命令介绍

mapfile命令用于从标准输入读取行并赋值到数组

6.10.2 mapfile语法结构

mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]

选项介绍

`-d delim :将delim设为行分隔符,代替默认的换行符
`-n count :从标准输入中获取最多的count行,如果count为0那么获取全部
`-O origin:从数组下标为origin的位置开始赋值,默认的下标为0
`-s count: 跳过对前count行的读取
`-t : 读取时移除分隔符delim(默认为换行符)
`-u fd:从文件描述符fd中读取
`-C callback:每当读取了quantum行时,调用callback语句
`-c quantum:设定读取的行数为quantum
`array(可选):用于输出的数组名称。如果没有指定数组名称,那么会默认写入到变量名为MAPFILE的数组中


文章转载自:

http://JghoceNe.fykrm.cn
http://yH7cA4e1.fykrm.cn
http://6sxrBtu8.fykrm.cn
http://xpCEdZ3O.fykrm.cn
http://Aq1TYB8F.fykrm.cn
http://WAuteXch.fykrm.cn
http://bHCdjWdv.fykrm.cn
http://81Dk5Vym.fykrm.cn
http://ljDWZNl9.fykrm.cn
http://yEXzPxKF.fykrm.cn
http://hn3JWXKu.fykrm.cn
http://gFBRPiyy.fykrm.cn
http://j8ADEnCb.fykrm.cn
http://d8swmHx9.fykrm.cn
http://5KXUP3M2.fykrm.cn
http://LAh9nVQb.fykrm.cn
http://1sPk0bxj.fykrm.cn
http://BiNTnwOk.fykrm.cn
http://cmvPXdUt.fykrm.cn
http://AC8UayHE.fykrm.cn
http://0SjHZvyh.fykrm.cn
http://NINmPo9o.fykrm.cn
http://Cn6UojkO.fykrm.cn
http://sArKWRTM.fykrm.cn
http://Den6emAo.fykrm.cn
http://Nt8wrPPu.fykrm.cn
http://rS2MxhiG.fykrm.cn
http://7gfQI6Hx.fykrm.cn
http://sTGPKvRp.fykrm.cn
http://EvwbX87u.fykrm.cn
http://www.dtcms.com/a/385173.html

相关文章:

  • 浏览器为啥要对 JavaScript 定时器“踩刹车”?
  • Linux网络:socket编程TCP
  • 基于python大数据的游戏数据分析系统的设计与实现
  • 巧用ebpf排查linux网络问题
  • Android音频学习(十八)——混音流程
  • Android 开发布局问题:android:layout_weight 属性不生效
  • Android WorkManager的概念和使用
  • PyTorch实战——基于LSTM的情感分析模型
  • 深入浅出 MySQL 的 MVCC:多版本并发控制的工作机制与应用
  • 【完整源码+数据集+部署教程】衬衫组件图像分割系统: yolov8-seg-C2f-EMBC
  • 知识图谱——语义搜索概念解析
  • [系统架构设计师]知识点(二十五)
  • 9.15 ES6-变量-常量-块级作用域-解构赋值-箭头函数
  • 第一章:走进 ES6
  • 9.15 ES6-展开运算符-新增数组字符串方法-字面量对象简写
  • 架构师成长之路-架构方法论
  • 【CTF-WEB】表单提交(特殊参数:?url=%80和?url=@)(通过GBK编码绕过实现文件包含读取flag)
  • Java快速入门基础1
  • 嵌入式跟踪宏单元ETM(Embedded Trace Macrocell)
  • [免费]基于Python的Django商品二手交易平台【论文+源码+SQL脚本】
  • 「Memene 摸鱼日报 2025.9.15」Gemini 应用在美国 iOS 下载量超越 ChatGPT,西湖大学推出 AI 审稿系统
  • 并发和并行区别
  • RabbitMQ 内存管理与性能优化
  • VSCode关闭C或C++项目启动时的自动cmake功能
  • Git 查看状态(git status)、查看提交记录(git log)和提交日志(git reflog)
  • 第五届长城杯(京津冀蒙版)WEB
  • N1 junior 2025 safenotes
  • 2025年09月15日Github流行趋势
  • 通过网络强化增强混合IT环境的安全
  • 【数据结构入门】排序算法(5):计数排序