shell编程系列(2)-数组的定义和使用

文章目录

  • 前言
  • 数组的定义
  • 关联数组(字典)
  • 数组的常用操作
    • 获取数组长度
    • 获取数组中所有元素
    • 数组中新增元素
    • 删除数组中元素
    • 删除整个数组
    • 复制数组
    • 拼接数组
    • 加载文件内容到数组
    • 遍历数组
  • 结语

前言

在上一篇中讲了普通变量的定义和使用,在本篇中会讲解数组的定义和使用。
数组是shell编程中唯一原生数据结构,日常在shell编程中如果涉及到多个数据的存储和计算,就可以使用到数组。
另外在shell中数组仅支持一维数组,不支持多维,这点其实是由shell编程语言的定位所决定的,shell语言擅长一些自动化的处理,并不擅长处理太过复杂的数据。

数组的定义

shell中的数组是一种弱类型,因此并不要求数组中的元素类型都相同,同一个数组中的元素可以有字符串、整型和浮点数等。

数组的定义也有两种定义方式,一种是不使用关键字,如下:

# 定义数组
fruit_array=("apple" "peach" 1 3.14)# 也可以直接通过索引赋值来定义数组
test_array[1]="test str"
test_array[3]=12

另一种数组定义方式是使用declare关键字,如下:

# 使用declare定义
declare -a name_array
name_array[0]="tom"
name_array[1]="jerry"

注意事项:

  1. 数组的索引是从0开始的,这一点和java、c++等编程语言是一样的
  2. 数组定义的"="左右不能有空格
  3. 数组中允许有空值

关联数组(字典)

上面定义的数组,数组的索引默认都是使用了顺序的整数,其实在shell中数组的索引也可以是字符串。
通过这个特性我们就可以模拟出类似于Python中的字典数据结构和Java中的map数据结构。

定义方式如下:

# 使用declare定义关联数组
declare -A array
array=([name]="tom" [age]=3 [gender]=man)# 获取数组指定元素
${array[age]}

数组的常用操作

这里预先定义好一个数组,后面的操作都使用这个数组

declare -a fruit=("apple" "peach" "banana")declare -a animal=("dog" "cat" "cow")

获取数组长度

shell中通过 $# 操作符获取长度,如下

${#fruit[@]}
# 或者
${#fruit[*]}

获取数组中所有元素

${fruit[@]}
# 或者
${fruit[*]}

数组中新增元素

可以通过指定索引的方式新增元素,如下:

fruit[3]="orange"
fruit[4]="peer"

删除数组中元素

使用unset指令

# 删除fruit数组的第五个元素
unset fruit[4]
# 删除fruit数组的第四个元素
unset fruit[3]

删除整个数组

也是使用unset指令

# 删除fruit数组
unset fruit

复制数组

# 复制fruit数组
new_fruit=("${fruit[@]}")

拼接数组

# 拼接fruit数组和animal数组
new_array=("${fruit[@]}" "${animal[@]}")

加载文件内容到数组

我们可以读取文件的内容直接生成数组

# 假设我们有一个文件 fruit.txt 内容如下
cat fruit.txt
apple
peach
orange
# 读取 fruit.txt 到数组中
fruit_array=(`cat "fruit.txt"`)

注意事项:

  1. 读取fruit.txt 时并不是单引号' 而是反引号`(键盘中左上角数字1左边的按键),在显示上单引号和反引号看起来差不多,一定要注意啊
  2. shell中的单引号表示字符串全引用,反引号表示执行命令获取执行结果

遍历数组

数组的遍历会使用到for循环,这里先做了解,后面的文章会详细讲解

#! /bin/bash
array=(Mon Tue Wed Thu Fri Sat Sun)# 通过循环结构遍历数组
for i in ${array[@]}
doecho  $i
done

结语

关于数组的知识就先写这么多,这个系列会持续更新,欢迎大家多多支持。

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

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

相关文章

leetcode:2133. 检查是否每一行每一列都包含全部整数(python3解法)

难度:简单 对一个大小为 n x n 的矩阵而言,如果其每一行和每一列都包含从 1 到 n 的 全部 整数(含 1 和 n),则认为该矩阵是一个 有效 矩阵。 给你一个大小为 n x n 的整数矩阵 matrix ,请你判断矩阵是否为一…

modbus中如何将float转换为short[]

modbus4j中 有一个发送的方法 public final ModbusResponse send(ModbusRequest request) throws ModbusTransportException,其中 WriteRegistersRequest 是一个用于向 Modbus 设备写入多个寄存器的请求。Modbus 是一种工业通信协议,用于连接电子设备。在 Modbus 通…

matlab配置

matlab配置 windowslinux挂载安装MATLAB windows 按照这里一步步配置就行( 移动硬盘中软件备份中自取) linux linux配置步骤 挂载 sudo mount -t auto -o loop /media/oyk/Elements/ubuntu/MATLAB/R2017a_glnxa64_dvd1.iso ./matlab/安装MATLAB 挂载完成后,先…

SpringCloudAlibaba之Nacos的持久化和高可用——详细讲解

目录 一、Nacos持久化 1.持久化说明 2.安装mysql数据库5.6.5以上版本(略) 3.修改配置文件 二、nacos高可用 1.集群说明 2.nacos集群架构图 2.集群搭建注意事项 3.集群规划 4.搭建nacos集群 5.安装Nginx 6.配置nginx conf配置文件 7.启动nginx进行测试即可 一、Nacos持久…

laravel8中常用路由使用(笔记四)

目录 1、框架路由目录统一放该目录 2、基本路由,路由都调用Route方法 3、控制器使用路由 4、路由参数 5、路由组 6、命名路由 7、命令查看当前路由列表 8、路由缓存 在Laravel 8中,路由定义了应用程序中接受请求的方式。它们定义了URL和相应的控制器方法之间的…

HTML input 属性笔记

Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍。 1,typetext 输入类型是text,这是我们见的最多也是使用最多的…

13、LCD1602调试工具

LCD1602调试工具 使用LCD1602液晶屏作为调试窗口&#xff0c;提供类似Printf函数的功能&#xff0c;可实时观察单片机内部数据的变化情况&#xff0c;便于调试和演示。 main.c #include <REGX52.H> #include "LCD1602.h" #include "Delay.h"//存储…

【开源】基于JAVA的海南旅游景点推荐系统

项目编号&#xff1a; S 023 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S023&#xff0c;文末获取源码。} 项目编号&#xff1a;S023&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四…

前端开发学习 (三) 列表功能

一、列表功能 1、列表功能 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compa…

锂电行业废水及母液除铊解决方案,除铊树脂技术

锂电池原材料和生产设备的制造、电池回收和处理等&#xff0c;产业的发展会带来铊排放问题。除了锂电池生产过 程中存在的铊污染外&#xff0c;企业的生活污水或者初期雨水也含有铊&#xff0c;因为铊是一种广泛存在于自然环境中的 元素&#xff0c;存在于饮用水、土壤和食物中…

高效视频剪辑:按指定时长批量分割视频,释放无尽创意

随着数字媒体技术的不断发展&#xff0c;视频剪辑已经成为日常生活中不可或缺的一部分。无论是制作电影、电视剧&#xff0c;还是创意生活短视频&#xff0c;视频剪辑都扮演着重要的角色。然而&#xff0c;对于许多非专业人士来说&#xff0c;视频剪辑可能是一项复杂而耗时的任…

27.0/多态/对象向上转型/向下转型/抽象类/抽象方法。

目录 27.1为什么使用多态? 27.1.2什么是多态 27.1.3对象多态 27.1.4多态的使用前提 27.2 向上转型 27.3向下转型 (面试题) 27.4抽象类和抽象方法 特点(面试题): 27.1为什么使用多态? 需求1&#xff1a;动物园让我们实现一个功能&#xff1a; 创建一个狗类 &#xff0c;狗…

Leetcode—739.每日温度【中等】

2023每日刷题&#xff08;四十二&#xff09; Leetcode—739.每日温度 单调栈实现思想 从右到左实现代码 class Solution { public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n temperatures.size();stack<int> st;vector<i…

各种数据库查询运行中的sql以及终止进程

目录 mysql pg 查询各种数据源&#xff0c;查询运行中的sql以及终止进程总结 mysql 1、查询运行中的sql (1) SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE dbxx; (2) show processlist; select concat(kill ,id ,;) FROM INFORMATION_SCHEMA.PROCESSLIST WH…

ensp 启动设备时报40错误,然后一直没有去管,再次进去就好了,我知道是配置虚拟机的时候修改了一些设置:

第一个阶段&#xff1a; 那时我是重置电脑之后就安装了ensp所以没有出现什么问题&#xff0c;&#xff08;那时没有导入ce6800和12800还有防火墙6000&#xff09; 第二个阶段&#xff1a; 因为有华为相关的实验要做&#xff0c;所以心血来潮打开了ensp&#xff08;路由器之前…

Digicert OV 代码签名介绍

Digicert OV 代码签名证书是一种数字证书&#xff0c;用于对软件代码进行数字签名。数字签名是一种验证软件来源和完整性的技术&#xff0c;通过使用私有密钥对代码进行签名&#xff0c;并在签名后使用公共密钥验证签名。 可基于更多平台&#xff0c;最大限度地提高分发量和收…

03、K-means聚类实现步骤与基于K-means聚类的图像压缩(2)

03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;2&#xff09; 工程下载&#xff1a;K-means聚类实现步骤与基于K-means聚类的图像压缩 其他&#xff1a; 03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;1&#xff09; 03、K-means聚类实现…

在easyswoole 中,配置文件如何加载外部配置

在一个项目中 目录结构是这样的 网站的公共配置&#xff0c;包括一些数据库连接配置&#xff0c;redis连接配置 /web/config/redis_config.php/web/config/mysql_config.php 下面是Easyswoole 项目目录 所有的配置均放在ES项目中的Config目录中 文件名且采用大驼峰命名。如…

深度学习神经网络加大batchsize训练速度降低的原因(GPT)

在深度学习中&#xff0c;批量大小&#xff08;batch size&#xff09;是指在每次参数更新时一次性输入到模型中的样本数量。通常情况下&#xff0c;增大批量大小可以提高训练过程中的计算效率&#xff0c;因为可以利用并行计算的优势。然而&#xff0c;当批量大小过大时&#…

Linux 命令ln

1什么是链接 ln在Linux中 ln 命令的功能是为某一个文件在另外一个位置建立一个同步的链接&#xff0c;当我们需要在不同的目录&#xff0c;用到相同的文件时&#xff0c;我们不需要在每一个需要的目录下都放一个必须相同的文件&#xff0c;我们只要在某个固定的目录&#xff0…