Linux shell编程学习笔记15:定义数组、获取数组元素值和长度
一、 Linux shell 脚本编程中的数组概述
数组是一种常见的数据结构。跟大多数编程语言一样,大多数Linux shell脚本支持数组,但对数组的支持程度各不相同,比如数组的维度,是支持一维数组还是多维数组?再如,数组元素的下标是从 0 开始还是从1开始?则因shell而异,下面我们以zsh、sh、bash为例来讲解。
二、数组的定义
在Linux shell脚本编程中,定义数组有两种方法。
(一)数组名=(数值1 数值2 …… 数值n)
数值之间用空格间隔。
实例:
1.在zsh中
(1)在命令行定义
# csdn @ edu in ~ [21:37:32]
$ a=(1 'a' b)# csdn @ edu in ~ [21:37:42]
$ echo $a
1 a b
我们首先用命令 a=(1 'a' b) 定义了数组a
然后用命令 echo $a 显示数组a 的元素。
(2)在脚本文件中定义
# csdn @ edu in ~ [22:20:47] C:1
$ echo 'a=(1 'a' b)' > a.sh# csdn @ edu in ~ [22:21:31]
$ echo 'echo $a' >> a.sh# csdn @ edu in ~ [22:21:48]
$ cat a.sh
a=(1 a b)
echo $a# csdn @ edu in ~ [22:21:51]
$ source ./a.sh
1 a b# csdn @ edu in ~ [22:22:01]
$
在上面的实例中,我们首先使用使用echo + 输出重定向方式将数组定义语句 echo 'a=(1 'a' b)' > a.sh 写入脚本文件 a.sh
然后 将 显示数组a元素的命令 echo 'echo $a' >> a.sh 写入脚本文件 a.sh
接下来我们使用cat命令查看脚本文件 a.sh的内容:
a=(1 a b)
echo $a
最后,我们使用命令 source ./a.sh 执行脚本文件a.sh。
注意,在上面创建的脚本文件 a.sh中,我们没有在第一行写入shebang或hashbang语句来指定脚本解释器。
2.在sh中
(1)在命令行定义
[csdn ~]$ exec sh
sh-4.2$ a=(1 'a' b)
sh-4.2$ echo $a
1
sh-4.2$
(2)在脚本文件中定义
sh-4.2$ echo 'a=(1 'a' b)' > a.sh
sh-4.2$ echo 'echo $a' >> a.sh
sh-4.2$ cat a.sh
a=(1 a b)
echo $a
sh-4.2$ . a.sh
sh: .: a.sh: file not found
sh-4.2$ source ./a.sh
1
sh-4.2$
3.在bash中
(1)在命令行定义
# csdn @ edu in ~ [23:27:45] C:127
$ exec bash
[csdn ~]$ echo $0
bash
[csdn ~]$ a=(1 'a' b)
[csdn ~]$ echo $a
1
[csdn ~]$
在bash中,数组同样创建起来了,与上面不同的是,命令 echo $a 只显示了数组中的第1个元素,而不是所有元素。
(2)在脚本文件中定义
[csdn ~]$ echo 'a=(1 'a' b)' > a.sh
[csdn ~]$ echo 'echo $a' >> a.sh
[csdn ~]$ cat a.sh
a=(1 a b)
echo $a
[csdn ~]$ . a.sh
1
[csdn ~]$
与上面的在命令行定义数组一样,bash中的命令 echo $a 只显示了数组中的第1个元素,而不是所有元素。
(二)数组名[下标]=数值
1.在zsh中
(1)在命令行定义
csdn @edu in ~ b[0]=0
zsh: b: assignment to invalid subscript range
csdn @edu in ~ b[1]=1
csdn @edu in ~ b[2]=a
csdn @edu in ~ echo $b
1 a
csdn @edu in ~
在上面的例子中,我们首先尝试直接在命令行定义数组元素:b[0]=0,但是zsh提示下标超出范围。
接下来,我们的命令 b[1]=1 和 b[2]=a 顺利完成,最后我们用命令 echo $b 显示 数组b的2个元素值:1 a。
可见,在zsh中,数组元素的下标是从1开始的。
(2)在脚本文件中定义
$ echo 'b[0]=0' > b.sh
# csdn @ edu in ~ [22:07:01]
$ echo 'b[1]=1' >> b.sh# csdn @ edu in ~ [22:07:24]
$ echo 'b[2]=a' >> b.sh# csdn @ edu in ~ [22:07:39]
$ echo 'echo $b' >> b.sh# csdn @ edu in ~ [22:08:05]
$ cat b.sh
b[0]=0
b[1]=1
b[2]=a
echo $b# csdn @ edu in ~ [22:08:17]
$ source ./b.sh
./b.sh:1: b: assignment to invalid subscript range# csdn @ edu in ~ [22:08:27] C:126
$ bash ./b.sh
0# csdn @ edu in ~ [22:08:53]
$
接着我们使用echo + 输出重定向方式将数组定义语句
b[0]=0
b[1]=1
b[2]=a
写入脚本文件b.sh
然后 我们将 显示数组元素 的命令 echo 'echo $b' >> b.sh 写入脚本文件b.sh
随后我们使用命令 cat b.sh 查看脚本文件b.sh 的内容:
b[0]=0
b[1]=1
b[2]=a
echo $b
接下来我们使用命令 source ./b.sh 来执行脚本文件b.sh,但是命令在zsh下出错了:
./b.sh:1: b: assignment to invalid subscript range
这再次说明,在zsh中,数组元素的下标是从1开始的。
最后我们使用命令 bash ./b.sh 来执行脚本,命令顺利完成。
可见,在bash 中,数组元素的下标是从0开始的。
2.在sh中
(1)在命令行中定义
csdn @edu in ~ exec sh
sh-4.2$ b[0]=0
sh-4.2$ b[1]=1
sh-4.2$ b[2]=a
sh-4.2$ echo $b
0
sh-4.2$
数组成功创建,但只看到了数组中的第1个元素值。
(2)在脚本文件中定义
sh-4.2$ echo 'b[0]=0' > b.sh
sh-4.2$ echo 'b[1]=1' >> b.sh
sh-4.2$ echo 'b[2]=a' >> b.sh
sh-4.2$ echo 'echo $b' >> b.sh
sh-4.2$ cat b.sh
b[0]=0
b[1]=1
echo $b
sh-4.2$ source ./b.sh
0
sh-4.2$
我们先使用echo + 输出重定向方式将数组定义语句
b[0]=0
b[1]=1
b[2]=a
写入脚本文件b.sh
然后 我们将 显示数组元素 的命令 echo 'echo $b' >> b.sh 写入脚本文件b.sh
随后我们使用命令 cat b.sh 查看脚本文件b.sh 的内容:
b[0]=0
b[1]=1
b[2]=a
echo $b
最后我们使用 source ./b. sh 命令来执行脚本文件b.sh,数组成功创建,但只看到了数组中的第1个元素值。
3.在bash中
(1)在命令行中定义
# csdn @ edu in ~ [23:53:42]
$ exec bash
[csdn ~]$ echo $0
bash
[csdn ~]$ b[0]=0
[csdn ~]$ b[1]=1
[csdn ~]$ b[2]=a
[csdn ~]$ echo $b
0
[csdn ~]$
命令全部顺利执行,可见在bash中,数组元素的下标是从0开始的,但echo $b只显示了数组第1个元素值。
(2)在脚本文件中定义
[csdn ~]$ echo b[0]=0 > b.sh
[csdn ~]$ echo b[1]=1 >> b.sh
[csdn ~]$ echo b[2]=a >> b.sh
[csdn ~]$ echo 'echo $b' >> b.sh
[csdn ~]$ cat b.sh
b[0]=0
b[1]=1
b[2]=a
echo $b
[csdn ~]$ . b.sh
0
[csdn ~]$
在脚本文件中执行跟 命令行执行结果是一样的。
(三)小结
在zsh中,数组元素的下标是从 1 开始的,使用“$数组名” 可以获得数组所有元素值。
在sh和bash中,数组元素的下标是从 0 开始的,使用“$数组名” 只能获得数组第1个元素值。
三、获取所有的数组元素
通过上面的实例,我们发现在sh和bash中,使用“$数组名” 只能获得数组第1个元素值,那么如何获取所有的数组元素呢?我们可以使用* 或 @ 作为下标来获取,具体格式即:
${数组名[@]}
或
${数组名[*]}
(一)zsh中
# csdn @ edu in ~ [12:24:50]
$ echo $0
/bin/zsh# csdn @ edu in ~ [12:25:24]
$ a=(1 2 'a')# csdn @ edu in ~ [12:25:42]
$ echo $a
1 2 a# csdn @ edu in ~ [12:27:06]
$ echo ${a[@]}
1 2 a# csdn @ edu in ~ [12:27:39]
$ echo ${a[*]}
1 2 a# csdn @ edu in ~ [12:32:40]
$
(二)在sh中
# csdn @ edu in ~ [12:32:40]
$ exec sh
sh-4.2$ a=(1 2 'a')
sh-4.2$ echo $a
1
sh-4.2$ echo ${a[@]}
1 2 a
sh-4.2$ echo ${a[*]}
1 2 a
sh-4.2$
(三)在bash中
sh-4.2$ exec bash
[csdn ~]$ a=(1 2 'a')
[csdn ~]$ echo $a
1
[csdn ~]$ echo ${a[@]}
1 2 a
[csdn ~]$ echo ${a[*]}
1 2 a
[csdn ~]$
四、获取数组或数组元素的长度
在介绍字符串时,我们说过获取字符串的格式是:${#字符串名},获取数组或数组元素长度的格式是相似的:
${#数组名[下标]}
或
${#数组名[下标]}
如果要取数组的长度,那么下标就用*或 @。如果要取数组某个元素的长度,那么下标就用元素的下标。
(一)在zsh中
# csdn @ edu in ~ [12:57:21]
$ echo $0
/bin/zsh# csdn @ edu in ~ [12:57:24]
$ b[1]=1# csdn @ edu in ~ [12:57:31]
$ b[2]=22# csdn @ edu in ~ [12:57:36]
$ echo ${b[*]}
1 22# csdn @ edu in ~ [12:57:49]
$ echo ${#b[*]}
2# csdn @ edu in ~ [12:57:55]
$ echo ${#b[@]}
2# csdn @ edu in ~ [12:57:59]
$ echo ${b[0]}
# csdn @ edu in ~ [12:58:07]
$ echo ${#b[0]}
0# csdn @ edu in ~ [12:58:11]
$ echo ${b[1]}
1# csdn @ edu in ~ [12:58:26]
$ echo ${#b[1]}
1# csdn @ edu in ~ [12:58:30]
$ echo ${b[2]}
22# csdn @ edu in ~ [12:58:35]
$ echo ${#b[2]}
2
(二)sh中
# csdn @ edu in ~ [13:07:28]
$ exec sh
sh-4.2$ b[1]=1
sh-4.2$ b[2]=22
sh-4.2$ echo ${b[*]}
1 22
sh-4.2$ echo ${#b[*]}
2
sh-4.2$ echo ${#b[@]}
2
sh-4.2$ echo ${b[0]}sh-4.2$ echo ${#b[0]}
0
sh-4.2$ echo ${b[1]}
1
sh-4.2$ echo ${#b[1]}
1
sh-4.2$ echo ${b[2]}
22
sh-4.2$ echo ${#b[2]}
2
sh-4.2$
(三)bash中
[csdn ~]$ b[1]=1
[csdn ~]$ b[2]=22
[csdn ~]$ echo ${b[@]}
1 22
[csdn ~]$ echo ${#b[@]}
2
[csdn ~]$ echo ${#b[*]}
2
[csdn ~]$ echo ${b[0]}[csdn ~]$ echo ${#b[0]}
0
[csdn ~]$ echo ${b[1]}
1
[csdn ~]$ echo ${#b[1]}
1
[csdn ~]$ echo ${b[2]}
22
[csdn ~]$ echo ${#b[2]}
2
[csdn ~]$
在上面的实例中,由于zsh中数组元素下标是从1开始的,所以我们定义数组b时,是从下标为1 的元素开始的。
然后我们先获取整个数组的元素值和长度,然后从下标0开始获取数组每个元素的值和长度。
值得注意的是,我们使用命令 echo ${b[0]} 尝试显示数组b中下标为0 的元素值 时,系统没有提示出错;使用命令echo ${#b[0]}尝试显示数组b中下标为0 的元素的长度时,系统反馈为0。
相关文章:

Linux shell编程学习笔记15:定义数组、获取数组元素值和长度
一、 Linux shell 脚本编程中的数组概述 数组是一种常见的数据结构。跟大多数编程语言一样,大多数Linux shell脚本支持数组,但对数组的支持程度各不相同,比如数组的维度,是支持一维数组还是多维数组?再如,…...
k8s部署kafka,并使用zookeeper做注册中心
kafka在3.x版本后增加KRaft作为自己的注册中心,可以不依赖外部的zk;这里上一篇已经部署好了zk,kafka依然使用zk作为注册中心。 这里使用kafka是为集成zipkin收发微服务接口链路日志数据,只需要部署1个实列即可够用。 编写脚本yam…...
关于Nginx缓存
Nginx缓存 一般情况下系统用到的缓存有三种 服务端缓存: 缓存存在后端服务器,如redis代理缓存: 缓存存储在代理服务器或中间件,内容从后端服务器获取,保存在本地客户端缓存: 缓存在浏览器什么时候会出现3…...
为什么Open3D可视化TensorFlow张量速度超慢
问题描述 在使用Open3D可视化TensorFlow张量表示的点云时速度超慢 原因分析 可能是因为Open3D没有针对tf.Tensor做优化,也可能是tf.Tensor本身没有对张量的操作做优化,所以可能如果要在CPU中计算,numpy可能性能更好。 解决方案 open3d.u…...

使用element-UI Cascader组件,实现第一级单选选,第二级,第三级,子级可以多选
最近开发过程中,遇到需求测一个需求,就是级联选择器,需要多选;但是第一级是单选; 既要单选又要复选。参照网上内容,自己整理了一下功能实现; 如下图: 思路:1.把第一层的…...

防止消息丢失与消息重复——Kafka可靠性分析及优化实践
系列文章目录 上手第一关,手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么,以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析,打破面试难关 防止消息丢失与消息重复——Kafka可…...

【Linux】Linux中Crontab(定时任务)命令详解及使用教程
文章目录 前言1.使用yum命令安装Crontab:2.查看Crontab状态:3.添加定时任务:4.查看任务列表:5.Crontab相关命令:6.部分脚本无法执行问题:7.Crontab默认调度任务:8.注意清理系统用户的邮件日志&a…...

计算机毕设 flink大数据淘宝用户行为数据实时分析与可视化
文章目录 0 前言1、环境准备1.1 flink 下载相关 jar 包1.2 生成 kafka 数据1.3 开发前的三个小 tip 2、flink-sql 客户端编写运行 sql2.1 创建 kafka 数据源表2.2 指标统计:每小时成交量2.2.1 创建 es 结果表, 存放每小时的成交量2.2.2 执行 sql &#x…...

8.2 矢量图层点要素单一符号使用一
文章目录 前言单一符号(Single symbol)渲染简单标记(Simple Marker)QGis代码实现 SVG标记(SVG marker)QGis代码实现 总结 前言 上一篇教程对矢量图层符号化做了一个整体介绍,并以点图层为例介绍了可以使用的渲染器&am…...
SQL企业微信群机器人消息推送
--参考资料地址 --微软官方地址: https://learn.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/ole-automation-stored-procedures-transact-sql?view=sql-server-ver16 --腾讯官方地址:https://developer.work.weixin.qq.com/ --使…...

vscode远程连接ubuntu
修改环境变量,改使用git自带的ssh工具 openssh: C:\Windows\System32\OpenSSH\ssh.exeGit ssh: C:\Program Files\Git\usr\bin\ssh.exe vscode安装插件remote-ssh 重开软件,在左侧拓展入口下方,进入远程资源管理器 点击设置,进…...
Positive Technologies 在迪拜宣布与地区网络安全解决方案提供商开展合作
在中东最大的信息技术展 GITEX GLOBAL 2023 的间隙,Positive Technologies 同意与八家组织(网络安全服务和解决方案提供商)合作,在该地区开展合作,推广最先进的产品,并分享信息安全领域的经验。该公司强调了…...

Pyside6 QTextEdit
Pyside6 QTextEdit QTextEdit使用QTextEdit常用函数文本编辑类函数文本框格式设置函数设置文字颜色设置文字背景颜色设置文字格式设置文本框样式程序设置界面设置 QTextEdit信号textChanged信号 完整程序界面程序主程序 QTextEdit类提供了一个用于编辑和显示纯文本和富文本的组…...
Hadoop核心机制详细解析
Hadoop核心机制详细解析 Hadoop的核心机制是通过HDFS文件系统和MapReduce算法进行存储资源、内存和程序的有效利用与管理。在现实的实例中,通过Hadoop,可以轻易的将多台普通的或低性能的服务器组合成分布式的运算-存储集群,提供大数据量的存…...

Chromium源码由浅入深(一)
工作中需要对Chromium源码、尤其是源码中图形部分进行深入研究,所以借此机会边学习边写文章,分享一下我的实时学习研究Chromium源码的由浅入深的过程。 闲言少叙,书归正传。 通过命令行启动Chrome浏览器,命令及结果如下…...

Spring Authorization Server 1.1 扩展 OAuth2 密码模式与 Spring Cloud Gateway 整合实战
目录 前言无图无真相创建数据库授权服务器maven 依赖application.yml授权服务器配置AuthorizationServierConfigDefaultSecutiryConfig 密码模式扩展PasswordAuthenticationTokenPasswordAuthenticationConverterPasswordAuthenticationProvider JWT 自定义字段自定义认证响应认…...

UE4 UltraDynamicSky 天气与水体交互
最上面的Lerp的A通道为之前的水面效果,B是做的冰面效果 用Dynamic_Landscape_Weather_Effects的BaseColor的R通道四舍五入作为Lerp的Alpha值 使用一张贴图,乘以RadialGradientExponential对材质边缘做弱化,RadialGradientExponential的Raid…...
Liunx 实时调度策略 SCHED_RR SCHED_FIFO 区别 适用情况
SCHED_RR SCHED_FIFO 适用情况 SCHED_FIFO 先进先出调度。只能在静态优先级高于0的情况下使用,这意味着当 SCHED_FIFO 线程变得可运行时,它总是立即抢占当前正在运行的任何 SCHED_OTHER、SCHED_BATCH 或 SCHED_IDLE 线程。SCHED_FIFO 线程一直运行到被…...
mac上使用虚拟机vm, 里面的镜像挂起会占用电脑的内存吗, 挂起和关机的区别是什么, 会影响正常电脑的内存和硬盘使用吗
解释 在Mac(或任何其他操作系统)上使用虚拟机(如VMware Fusion、Parallels Desktop、VirtualBox等)时,“挂起”(Suspend)和“关机”(Power Off或Shut Down)是两种不同的虚…...

AIGC时代 浪潮信息积极推动存储产品创新
近几年,AIGC的兴起,进一步驱动了全闪、混闪等存储产品的创新,也为市场带来了新的机遇,对于厂家而言,也需要升级存储产品的容量、性能及功能,方能满足场景诉求。对此,浪潮信息面向AIGC应用场景打…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...