简介shell的关联数组与普通数组
本文首先介绍shell的关联数组,然后介绍shell的普通数组,最后总结它们的共同语法。
shell的关联数组
定义一个关联数组,并打印它的key-value对
#!/bin/sh# 声明一个关联数组
declare -A HASH_MAP# 给关联数组赋值
HASH_MAP["Tom"]=130
HASH_MAP["Finix"]=150
HASH_MAP["Jason"]=90 # 遍历关联数组
for key in $(echo ${!HASH_MAP[*]})
dovalue=${HASH_MAP[$key]}echo "$key: $value"
done
执行结果如下:
Finix: 150
Jason: 90
Tom: 130
注意,这里的 ${!HASH_MAP[*]}是一个普通数组,存放的是所有的key.
定义关联数组的时候,也可以一次性写完。如下:
declare -A HASH_MAP=([Finix]=200 [Kate]=100 [Jerry]=120)
圆括号是数组的语法;[key]=value ;元素间用空格间隔。
下面是关于关联数组的常见使用技巧:
示例-1. 获取关联数组所有的key,将其存放在一个普通数组中
for item in ${!HASH_MAP[*]}
doecho $item
doneFinix
Kate
Jerry
第二种方法是把星号换成艾特, 效果是一样的。
for item in ${!HASH_MAP[@]}
doecho $item
doneFinix
Kate
Jerry
示例-2. 获取关联数组所有的value,将其存放在一个普通数组中
这里把上面取所有key的表达式中的感叹号去掉即可。
星号换成艾特也一样work
for score in ${HASH_MAP[*]}
doecho $score
done200
100
120for score in ${HASH_MAP[@]}
doecho $score
done200
100
120
示例-3. 获取关联数组长度
把取key表达式中的感叹号换成井号。
这里星号也可以换成艾特。
echo ${#HASH_MAP[*]}
3echo ${#HASH_MAP[@]}
3
示例-4. 获取特定key所对应的value
echo ${HASH_MAP["Finix"]}
200
星号与艾特的区别,即如何把所有元素拼接成一个字符串
那么,使用星号和艾特的区别到底是什么呢?
用双引号将上面取所有key或取所有value的表达式括起来以后,使用星号的就变成了一个字符串,使用井号的变成一个字符串数组。
注意,在上面的示例的for循环语句中,我们并没有给表达式加上双引号,现在来加一下:
首先看一下使用星号的:
for item in "${!HASH_MAP[*]}"
doecho $item
doneFinix Kate Jerryfor item in "${HASH_MAP[*]}"
doecho $item
done200 100 120
可以看到,和之前的示例-1及示例-2中的输出不同,这里的输出变成了一行,因为加上星号表达式加上双引号之后,就变成了一个字符串。
再来看看使用艾特的:
for item in "${!HASH_MAP[@]}"
doecho $item
doneFinix
Kate
Jerryfor item in "${HASH_MAP[@]}"
doecho $item
done200
100
120
可以看到,和之前并无区别。艾特的表达式,有没有双引号,返回的都是字符串数组。
declare -p 显示整个数组
最后的一个小知识点,就是使用 declare -p <ARRAY_NAME>可以打印出这个关联数组的详情。如下:
declare -p HASH_MAP
declare -A HASH_MAP=([Finix]="200" [Kate]="100" [Jerry]="120" )
注意,以上语句中,数组名之前不能加美元符号。
shell的普通数组
shell里的普通数组,就是一维数组。
声明shell中的普通数组:
declare -a <array_name>
以下给出shell数组的常见用法示例
示例-1. 定义数组
declare -a ARRAY=(10 20 30 "Hello" 50)# or just like below
ARRAY2=(10 20 30 "Hello" 50)
示例-2. 打印给定下标的元素值
echo ${ARRAY[2]}30
下标其实可以不连续
declare -a array=([0]=0 [1]=1 [5]=5 [10]=10)echo ${array[@]} # 花括号不能少
0 1 5 10echo ${array[4]} # 不存在的元素则为空
示例-3. 获取所有数组元素的值
for item in ${ARRAY[@]}
doecho $item
done10
20
30
Hello
50
与关联数组类似:第二种方法就是将星号换成艾特
for item in ${ARRAY[*]}
doecho $item
done10
20
30
Hello
50
示例-4. 获取所有数组元素的下标
看到了这么多和关联数组相同的操作,那么在数组名前用一下感叹号,会发生什么呢?
没错,当试图对普通数组取所有key值的时候,其实就是取到所有的下标了。
echo ${!ARRAY[*]}
0 1 2 3 4echo ${!ARRAY[@]}
0 1 2 3 4echo ${!array[*]}
0 1 5 10echo ${!array[@]}
0 1 5 10
示例-5. 获取数组元素个数
这个也和关联数组相同
echo ${#ARRAY[@]}
5
示例-6. 将所有元素拼接成一个字符串
与关联数组类似,给星号表达式加上双引号即可
for item in "${ARRAY[*]}"
doecho $item
done10 20 30 Hello 50one_item="${ARRAY[*]}"
echo $one_item
10 20 30 Hello 50echo ${one_item[0]}
10 20 30 Hello 50
示例-7. 给已有数组添加元素
使用 += 可以给已有数组添加元素。
ARRAY+=(100)echo ${ARRAY[@]}
10 20 30 Hello 50 100ARRAY+=(200 300)declare -p ARRAY
declare -a ARRAY=([0]="10" [1]="20" [2]="30" [3]="Hello" [4]="50" [5]="100" [6]="200" [7]="300")
总结
关联数组与普通数组,在很多操作上都是一致的,如:
-
取所有元素的值
${array[@]}
或
${array[*]} -
取所有元素的下标
${!array[@]}
或
${!array[*]} -
取数组的长度
${#array[@]}
或
${#array[*]} -
将所有数组元素拼接成一个字符串
echo "${ARRAY[*]}" -
取特定下标或key的元素的值
${ARRAY[INDEX]}
(END)
相关文章:
简介shell的关联数组与普通数组
本文首先介绍shell的关联数组,然后介绍shell的普通数组,最后总结它们的共同语法。 shell的关联数组 定义一个关联数组,并打印它的key-value对 #!/bin/sh# 声明一个关联数组 declare -A HASH_MAP# 给关联数组赋值 HASH_MAP["Tom"…...
玩转Mysql系列 - 第17篇:存储过程自定义函数详解
这是Mysql系列第17篇。 环境:mysql5.7.25,cmd命令中进行演示。 代码中被[]包含的表示可选,|符号分开的表示可选其一。 需求背景介绍 线上程序有时候出现问题导致数据错误的时候,如果比较紧急,我们可以写一个存储来…...
自动驾驶:轨迹预测综述
自动驾驶:轨迹预测综述 轨迹预测的定义轨迹预测的分类基于物理的方法(Physics-based)基于机器学习的方法(Classic Machine Learning-based)基于深度学习的方法(Deep Learning-based)基于强化学习…...
【uniapp/uview】u-datetime-picker 选择器的过滤器用法
引入:要求日期选择的下拉框在分钟显示时,只显示 0 和 30 分钟; <u-datetime-picker :show"dateShow" :filter"timeFilter" confirm"selDateConfirm" cancel"dateCancel" v-model"value1&qu…...
如何使用Docker部署Nacos服务?Nacos Docker 快速部署指南: 一站式部署与配置教程
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
yocto stm32mp1集成ros
yocto stm32mp1集成ros yocto集成ros下载meta-rosyocto集成rosrootfs验证 yocto集成ros 本章节介绍yocto如何集成ros系统用来作机器人开发。 下载meta-ros 第一步首先需要下载meta-ros layer,meta-ros的链接如下:https://github.com/ros/meta-ros/tre…...
Linux 中的 chroot 命令及示例
Linux/Unix系统中的chroot命令用于更改根目录。Linux/Unix 类系统中的每个进程/命令都有一个称为root 目录的当前工作目录。它更改当前正在运行的进程及其子进程的根目录。 在此类修改的环境中运行的进程/命令无法访问根目录之外的文件。这种修改后的环境称为“ chroot监狱”或…...
oracle的redo与postgreSQL的WAL以及MySQL的binlog区别
Oracle的redo日志、PostgreSQL的WAL(Write-Ahead Log)以及MySQL的binlog(二进制日志)都是数据库的事务日志,但它们在实现和功能上有一些区别。 1. 实现方式: - Oracle的redo日志是通过在事务提交前将事务操作记录到磁盘上的重做日志文件中来实现的。 - PostgreSQL…...
进入低功耗和唤醒
休眠模式 进入休眠模式 如果使用 WFI 指令进入睡眠模式,则嵌套向量中断控制器 (NVIC) 确认的任意外设中断都会 将器件从睡眠模式唤醒。 如果使用 WFE 指令进入睡眠模式,MCU 将在有事件发生时立即退出睡眠模式。唤醒事件可 通过以下方式产生ÿ…...
【多线程】volatile 关键字
volatile 关键字 1. 保证内存可见性2. 禁止指令重排序3. 不保证原子性 1. 保证内存可见性 内存可见性问题: 一个线程针对一个变量进行读取操作,另一个线程针对这个变量进行修改操作, 此时读到的值,不一定是修改后的值,即这个读线…...
【Windows注册表内容详解】
Windows注册表内容详解 第一章节 注册表基础 一、什么是注册表 注册表是windows操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”,也可以说是一个非常巨大的树状分层结构的数据库系统。 注册表记录了用户安装在计算机上的软件和每个程…...
大数据Hadoop入门之集群的搭建
hadoop的三种运行模式 本地模式:测试本地的hadoop是否能够运行,用来运行官方的代码。伪分布模式:原先有人拿来测试,目前测试都不用这个模式了。完全分布模式:多台服务器组成分布式环境,生产环境使用 分布式主机文件同步命令 sc…...
华为云云耀云服务器L实例评测|基于云服务器的minio部署手册
华为云云耀云服务器L实例评测|基于云服务器的minio部署手册 【软件安装版本】【集群安装(是)(否)】 版本 创建人 修改人 创建时间 备注 1.0 jz jz 2023.9.2 minio华为云耀服务器 一. 部署规划与架…...
龙智携手Atlassian和JFrog举办线下研讨会,探讨如何提升企业级开发效率与质量
2023年9月8日,龙智将携手Atlassian和JFrog于上海举办线下研讨会,以“大规模开发创新:如何提升企业级开发效率与质量”为主题,邀请龙智高级咨询顾问、Atlassian认证专家叶燕秀,紫龙游戏上海研发中心高级项目管理主管叶凯…...
2023数学建模国赛A题定日镜场的优化设计- 全新思路及代码
背景资料关键信息和要点如下: 定日镜:塔式太阳能光热发电站的基本组件,由纵向转轴和水平转轴组成,用于反射太阳光。 定日镜场:由大量的定日镜组成的阵列。 集热器:位于吸收塔顶端,用于收集太…...
CSS笔记(黑马程序员pink老师前端)圆角边框
圆角边框 border-radius:length; 效果显示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…...
水表电表集中远程抄表系统分析
电表水表远程抄表系统石家庄光大远通电气有限公司主要经营自动抄表,远程抄表,集中抄表,新供应信息,是石家庄光大远通电气有限公司自动远程抄表系统集信号采集、网络通信于一体的高性能抄表装置,该系统以485通讯方式读取水表电表的数据,以MBUS通讯方式读取…...
Android 通知
1. 原生Android通知的几种显示方式: 状态栏的图标:发出通知后,通知会先以图标的形式显示在状态栏中。 抽屉式通知栏:用户可以在状态栏向下滑动以打开抽屉式通知栏,并在其中查看更多详情及对通知执行操作。在应用或用户…...
【Unittest】Requests实现小程序项目接口测试
文章目录 一、搭建接口测试框架二、初始化日志三、定义全局变量四、封装接口五、编写测试用例六、生成测试报告 一、搭建接口测试框架 目录结构如下。 二、初始化日志 在utils.py文件中编写如下如下代码,初始化日志。 # 导入app.py全局变量文件 import app import l…...
Mac 搭建本地服务器
文章目录 一、启动服务器二、添加文件到本地服务三、手机/其他电脑 访问本机服务器 MacOS 自带Apatch 服务器。所以我这里选择Apatch服务器搭建 一、启动服务器 在safari中输入 http://127.0.0.1/ ,如果页面出现 it works,则代表访问成功。启动服务器 …...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
