Linux shell编程学习笔记15:定义数组、获取数组元素值和长度

news2024/9/28 19:27:13

一、 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。

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

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

相关文章

MongoDB 的集群架构与设计

一、前言 MongoDB 有三种集群架构模式,分别为主从复制(Master-Slaver)、副本集(Replica Set)和分片(Sharding)模式。 Master-Slaver 是一种主从复制的模式,目前已经不推荐使用。Re…

threejs(3)-详解材质与纹理

一、Matcap(MeshMatcapMaterial)材质原理与应用 Matcap是一张含有光照信息的贴图,通常是直接截取材质球截图来使用。因此Matcap可以很好的模拟静止光源下的光照效果。 最直接的方式就是直接使用在View空间下的模型法向量的xy分量去采样Matcap。 另外还有一种常见…

STM32F103单片机内部RTC实时时钟驱动程序

一、STM32f103系列RTC功能 RTC实时时钟功能是嵌入式软件开发中比较常用的功能,一般MCU的RTC功能都带有年月日时间寄存器,比如STM32F4xx系列,RTC描述如下: 可见F4系列的RTC功能比较强大,设置好初始时间后,读…

Power BI 傻瓜入门 8. 制作数据模型

本章内容包含: 描述不同的数据建模技术配置属性以满足数据模型要求设计模型以满足性能要求 您可能认为,通过Power BI对数据进行转换后,您将一帆风顺。在某些情况下,这是正确的。当然,当您创建了一个包含许多表的详细…

OpenCV 笔记(3):基本图形的绘制

Part11. 绘制简单的图形 绘图功能是 OpenCV 最基础的功能,OpenCV 提供了基础的绘制函数,用于帮助我们绘制一些基本的图形。通过这些函数的组合,我们也可以做一些高级的应用。 11.1 绘制点和圆 OpenCV 的绘制函数相对简单,而且很多…

[Unity]将所有 TGA、TIFF、PSD 和 BMP(可自定义)纹理转换为 PNG,以减小项目大小,而不会在 Unity 中造成任何质量损失

如何使用 只需在“项目”窗口中创建一个名为“编辑器”的文件夹,然后在其中添加此脚本即可。然后,打开窗口-Convert Textures to PNG,配置参数并点击“Convert to PNG! ”。 就我而言,它已将某些 3D 资源的总文件大小…

C语言汇总

汇总一(linux环境) /bin :bin是二进制(binary)英文缩写。 /boot:存放的都是系统启动时要用到的程序。 /dev:包含了所有Linux系统中使用的外部设备。 /etc:存放了系统管理时要用到的…

uniapp中 background-image 设置背景图片不展示问题

有问题 <view class"file-picker__box jsz" tap"jszxszUpload(jsz)"></view>.jsz {background-image: url(../../static/example_drive.png); }解决1 <view class"file-picker__box jsz" :style"{ background-image: url(…

Android APP 隐藏系统软键盘的方法

1.场景描述&#xff1a; 1) APP项目中经常会开发自定义软键盘&#xff1b;同时在使用EditText时&#xff0c;也会常常遇到自动弹出系统自带的软键盘&#xff0c;与自定义的软键盘产生冲突的情况&#xff1b;此时需要禁止EditText自动弹出系统软键盘&#xff0c;从而使自定义的…

汽车电子专有名词与相应技术

1.EEA &#xff08;Electronic & Electrical Architecture 电子电气架构&#xff09; EEA在宏观上概括为物理架构与逻辑架构的结合&#xff0c;微观上通过众多电子元器件的协同配合&#xff0c;或集成式或分布式的系统级电子电气架构&#xff0c;具体详见专栏 新能源汽车电…

volatile 关键字有什么用?它的实现原理是什么?

volatile volatile是Java中的一个关键字&#xff0c;用于修饰变量&#xff0c;表示该变量是“易变的”&#xff08;Volatile&#xff09;。 volatile 关键字有两个作用&#xff1a; 可以保证在多线程环境下共享变量的可见性。 通过增加内存屏障防止多个指令之间的重排序。 可见…

【图结构从入门到应用】图的表示和遍历,图搜索算法详解与示例

1图的概念 图是一种非常常见的数据结构&#xff0c;用于表示对象之间的关系。在计算机科学中&#xff0c;有许多不同的图类型&#xff0c;包括有向图&#xff08;Directed Graph&#xff09;和无向图&#xff08;Undirected Graph&#xff09;。图通常由节点&#xff08;顶点&a…

vscode json文件添加注释报错

在vscode中创建json文件&#xff0c;想要注释一波时&#xff0c;发现报了个错&#xff1a;Comments are not permitted in JSON. (521)&#xff0c;意思是JSON中不允许注释 以下为解决方法&#xff1a; 在vscode的右下角中找到这个&#xff0c;点击 在出现的弹窗中输入json wit…

Python 自动化(十五)请求和响应

准备工作 将不同day下的代码分目录管理&#xff0c;方便后续复习查阅 (testenv) [rootlocalhost projects]# ls mysite1 (testenv) [rootlocalhost projects]# mkdir day01 day02 (testenv) [rootlocalhost projects]# cp -rf mysite1/ day01/ (testenv) [rootlocalhost proj…

vue路径中“@/“代表什么

举例&#xff1a; <img src"/../static/imgNew/adv/tupian.jpg"/>其中&#xff0c;/是webpack设置的路径别名&#xff0c;代表什么路径&#xff0c;要看webpack的build文件夹下webpack.base.conf.js里面对于是如何配置&#xff1a; 上图中代表src,上述代码就…

KDChart3.0编译过程-使用QT5.15及QT6.x编译

文章目录 参考原文一、下载KDChart源文件二、下载安装CMake三、编译Qt5.15.0 编译Qt6.x 编译使用Qt6.X编译的直接看这最快 四、使用测试方法一&#xff1a;测试方法二&#xff1a; 参考原文 记录我的KDChart3.0编译过程 系统&#xff1a;win11&#xff0c;Qt5.15 &#xff0c;编…

Android View拖拽/拖放DragAndDrop自定义View.DragShadowBuilder,Kotlin(2)

Android View拖拽/拖放DragAndDrop自定义View.DragShadowBuilder&#xff0c;Kotlin&#xff08;2&#xff09; import android.graphics.Canvas import android.graphics.Point import android.graphics.drawable.ColorDrawable import android.os.Bundle import android.util…

关于前端如何下载后端接口返回content-type为application/octet-stream的文件

关于前端如何下载后端接口返回response-type为application/octet-stream的文件 问题描述 后端接口定义为直接返回一个文件&#xff0c;如果带认证信息可以直接通过浏览器url下载&#xff0c;但是接口需要传headers认证信息&#xff0c;url上又不支持传相关信息 解决 前端…

如何用 JMeter 编写性能测试脚本?

Apache JMeter 应该是应用最广泛的性能测试工具。怎么用 JMeter 编写性能测试脚本&#xff1f; 1. 编写 HTTP 性能测试脚本 STEP 1. 添加 HTTP 请求 img STEP 2. 了解配置信息 HTTP 请求各项信息说明&#xff08;以 JMeter 5.1 为例&#xff09;。 如下图所示&#xff1a;…

kibana监控

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