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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】从零开始学习Linux基本指令(三)

🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:Linux入门 🔥该文章主要了解Linux操作系统下的基本指令。 ⚡️该篇为Linux指令部分的终章,如果您想了解前两篇文章的…

【字符串】【将字符数组转为字符串】Leetcode 122 路径加密

【将字符数组转为字符串】Leetcode 122 路径加密 解法1 在Java中,char数组没有直接的toString()方法来将其转换为字符串。如果你想将char数组转换为字符串,可以使用String类的构造函数来实现: ⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐…

Kafka与Spark案例实践

1.概述 Kafka系统的灵活多变,让它拥有丰富的拓展性,可以与第三方套件很方便的对接。例如,实时计算引擎Spark。接下来通过一个完整案例,运用Kafka和Spark来合理完成。 2.内容 2.1 初始Spark 在大数据应用场景中,面对…

为什么HashMap头插法会造成死循环?

循环之后就直接退出了,所以当时没有造成死锁,是在下一次插入时,才造成的死锁

postman打开后,以前的接口记录不在,问题解决

要不这些文件保存在C:\Users\{用户名}\AppData\Roaming\Postman 比如,你目前使用的window登录用户是abc,那么地址便是C:\Users\abc\AppData\Roaming\Postman 打开后,这个目录下会有一些命名为backup-yyyy-MM-ddThh-mm-ss.SSSZ.json类似的文…

双十一购物狂欢节准备好买什么了吗?双十一这些好物不能错过

双十一是电商节,各大电商平台都会推出各种促销活动,吸引消费者抢购商品。在这个特别的时刻,许多人都迫不及待地开始筹备自己的购物清单,想要趁着这个机会购买自己心仪的商品。那么,在这个双十一购物狂欢节,…

LVS负载均衡及LVS-NAT模式

一、集群概述 1.1 集群的背景 集群定义:为解决某个特定问题将多个计算机组合起来形成一个单系统 集群目的:为了解决系统的性能瓶颈 集群发展历史: 垂直扩展:向上扩展,增加单个机器的性能,即升级硬件 水…

深入浅出排序算法之直接插入排序(拓展:折半插入排序)

目录 1. 图示解析 2. 原理解析 3. 代码实现 4. 性能分析 5. 折半插入排序(拓展) 直接插入排序和选择排序的第一趟就是第一个关键字 ! 1. 图示解析 2. 原理解析 整个区间被分为:① 有序区间;② 无序区间 每次选…

Leetcode刷题详解——山脉数组的峰顶索引

1. 题目链接&#xff1a;852. 山脉数组的峰顶索引 2. 题目描述&#xff1a; 符合下列属性的数组 arr 称为 山脉数组 &#xff1a; arr.length > 3存在i(0 < i < arr.length - 1&#xff09; 使得&#xff1a; arr[0] < arr[1] < ... arr[i-1] < arr[i] arr[…

基于YOLOv8模型和UA-DETRAC数据集的车辆目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型和UA-DETRAC数据集的车辆目标检测系统可用于日常生活中检测与定位汽车&#xff08;car&#xff09;、公共汽车&#xff08;bus&#xff09;、面包车&#xff08;vans&#xff09;等目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方…

Hadoop3教程(三十一):(生产调优篇)异构存储

文章目录 &#xff08;157&#xff09;异构存储概述概述异构存储的shell操作 &#xff08;158&#xff09;异构存储案例实操参考文献 &#xff08;157&#xff09;异构存储概述 概述 异构存储&#xff0c;也叫做冷热数据分离。其中&#xff0c;经常使用的数据被叫做是热数据&…

听GPT 讲Rust源代码--library/std(2)

File: rust/library/std/src/sys_common/wtf8.rs 在Rust源代码中&#xff0c;rust/library/std/src/sys_common/wtf8.rs这个文件的作用是实现了UTF-8编码和宽字符编码之间的转换&#xff0c;以及提供了一些处理和操作UTF-8编码的工具函数。 下面对这几个结构体进行一一介绍&…

kibana监控

采取方式 Elastic Agent &#xff1a;更完善的功能 Metricbeat&#xff1a;轻量级指标收集&#xff08;采用&#xff09; 传统收集方法&#xff1a;使用内部导出器收集指标&#xff0c;已不建议 安装 metricbeat Download Metricbeat • Ship Metrics to Elasticsearch | E…

使用element-UI Cascader组件,实现第一级单选选,第二级,第三级,子级可以多选

最近开发过程中&#xff0c;遇到需求测一个需求&#xff0c;就是级联选择器&#xff0c;需要多选&#xff1b;但是第一级是单选&#xff1b; 既要单选又要复选。参照网上内容&#xff0c;自己整理了一下功能实现&#xff1b; 如下图&#xff1a; 思路&#xff1a;1.把第一层的…

华为昇腾NPU卡 大模型LLM ChatGLM2模型推理使用

参考&#xff1a;https://gitee.com/mindspore/mindformers/blob/dev/docs/model_cards/glm2.md#chatglm2-6b 1、安装环境&#xff1a; 昇腾NPU卡对应英伟达GPU卡&#xff0c;CANN对应CUDA底层&#xff1b; mindspore对应pytorch&#xff1b;mindformers对应transformers 本…

USB学习(2):USB端点和传输协议(数据包、事物)详解

接着上一篇文章USB学习(1)&#xff1a;USB基础之接口类型、协议标准、引脚分布、架构、时序和数据格式&#xff0c;继续介绍一下USB的相关知识。 文章目录 1 USB端点(Endpoints)1.1 基本知识1.2 四种端点 2 传输协议2.1 数据包类型2.1.1 令牌数据包(Token packets)2.1.2 数据数…

学习笔记:tarjan

tarjan 引入 Robert Tarjan&#xff0c;计算机科学家&#xff0c;以 LCA、强连通分量等算法而闻名。Tarjan 设计了求解的应用领域的广泛有效的算法和数据结构。他以在数据结构和图论上的开创性工作而闻名&#xff0c;他的一些著名的算法有 Tarjan 最近公共祖先离线算法&#…

[Unity]给场景中的3D字体TextMesh增加描边方案二

如图所示仅支持图片内的/*数字 下面是资源

边缘计算:云计算的延伸

云计算已经存在多年&#xff0c;并已被证明对大大小小的企业都有好处&#xff1b;然而&#xff0c;直到最近边缘计算才变得如此重要。它是指发生在网络边缘的一种数据处理&#xff0c;更接近数据的来源地。 这将有助于提高效率并减少延迟以及设备和云之间的数据传输成本。边缘…

2023年中国汽车塑料模具市场规模、竞争格局及行业趋势分析[图]

汽车注塑模具主要用来制造汽车内外饰件以及座椅等其他塑料零部件&#xff0c;其中又以汽车内外饰件模具最多。汽车内外饰件主要由各类塑料、表皮、织物或复合材料制成&#xff0c;用到的模具主要是塑料模具。从现代汽车使用的材料来看&#xff0c;无论是外装饰件、内装饰件&…