当前位置: 首页 > news >正文

简介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的关联数组&#xff0c;然后介绍shell的普通数组&#xff0c;最后总结它们的共同语法。 shell的关联数组 定义一个关联数组&#xff0c;并打印它的key-value对 #!/bin/sh# 声明一个关联数组 declare -A HASH_MAP# 给关联数组赋值 HASH_MAP["Tom"…...

玩转Mysql系列 - 第17篇:存储过程自定义函数详解

这是Mysql系列第17篇。 环境&#xff1a;mysql5.7.25&#xff0c;cmd命令中进行演示。 代码中被[]包含的表示可选&#xff0c;|符号分开的表示可选其一。 需求背景介绍 线上程序有时候出现问题导致数据错误的时候&#xff0c;如果比较紧急&#xff0c;我们可以写一个存储来…...

自动驾驶:轨迹预测综述

自动驾驶&#xff1a;轨迹预测综述 轨迹预测的定义轨迹预测的分类基于物理的方法&#xff08;Physics-based&#xff09;基于机器学习的方法&#xff08;Classic Machine Learning-based&#xff09;基于深度学习的方法&#xff08;Deep Learning-based&#xff09;基于强化学习…...

【uniapp/uview】u-datetime-picker 选择器的过滤器用法

引入&#xff1a;要求日期选择的下拉框在分钟显示时&#xff0c;只显示 0 和 30 分钟&#xff1b; <u-datetime-picker :show"dateShow" :filter"timeFilter" confirm"selDateConfirm" cancel"dateCancel" v-model"value1&qu…...

如何使用Docker部署Nacos服务?Nacos Docker 快速部署指南: 一站式部署与配置教程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

yocto stm32mp1集成ros

yocto stm32mp1集成ros yocto集成ros下载meta-rosyocto集成rosrootfs验证 yocto集成ros 本章节介绍yocto如何集成ros系统用来作机器人开发。 下载meta-ros 第一步首先需要下载meta-ros layer&#xff0c;meta-ros的链接如下&#xff1a;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 指令进入睡眠模式&#xff0c;则嵌套向量中断控制器 (NVIC) 确认的任意外设中断都会 将器件从睡眠模式唤醒。 如果使用 WFE 指令进入睡眠模式&#xff0c;MCU 将在有事件发生时立即退出睡眠模式。唤醒事件可 通过以下方式产生&#xff…...

【多线程】volatile 关键字

volatile 关键字 1. 保证内存可见性2. 禁止指令重排序3. 不保证原子性 1. 保证内存可见性 内存可见性问题: 一个线程针对一个变量进行读取操作&#xff0c;另一个线程针对这个变量进行修改操作&#xff0c; 此时读到的值&#xff0c;不一定是修改后的值&#xff0c;即这个读线…...

【Windows注册表内容详解】

Windows注册表内容详解 第一章节 注册表基础 一、什么是注册表 注册表是windows操作系统、硬件设备以及客户应用程序得以正常运行和保存设置的核心“数据库”&#xff0c;也可以说是一个非常巨大的树状分层结构的数据库系统。 注册表记录了用户安装在计算机上的软件和每个程…...

大数据Hadoop入门之集群的搭建

hadoop的三种运行模式 本地模式:测试本地的hadoop是否能够运行&#xff0c;用来运行官方的代码。伪分布模式:原先有人拿来测试&#xff0c;目前测试都不用这个模式了。完全分布模式&#xff1a;多台服务器组成分布式环境&#xff0c;生产环境使用 分布式主机文件同步命令 sc…...

华为云云耀云服务器L实例评测|基于云服务器的minio部署手册

华为云云耀云服务器L实例评测|基于云服务器的minio部署手册 【软件安装版本】【集群安装&#xff08;是&#xff09;&#xff08;否&#xff09;】 版本 创建人 修改人 创建时间 备注 1.0 jz jz 2023.9.2 minio华为云耀服务器 一. 部署规划与架…...

龙智携手Atlassian和JFrog举办线下研讨会,探讨如何提升企业级开发效率与质量

2023年9月8日&#xff0c;龙智将携手Atlassian和JFrog于上海举办线下研讨会&#xff0c;以“大规模开发创新&#xff1a;如何提升企业级开发效率与质量”为主题&#xff0c;邀请龙智高级咨询顾问、Atlassian认证专家叶燕秀&#xff0c;紫龙游戏上海研发中心高级项目管理主管叶凯…...

2023数学建模国赛A题定日镜场的优化设计- 全新思路及代码

背景资料关键信息和要点如下&#xff1a; 定日镜&#xff1a;塔式太阳能光热发电站的基本组件&#xff0c;由纵向转轴和水平转轴组成&#xff0c;用于反射太阳光。 定日镜场&#xff1a;由大量的定日镜组成的阵列。 集热器&#xff1a;位于吸收塔顶端&#xff0c;用于收集太…...

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…...

水表电表集中远程抄表系统分析

电表水表远程抄表系统石家庄光大远通电气有限公司主要经营自动抄表,远程抄表,集中抄表,新供应信息&#xff0c;是石家庄光大远通电气有限公司自动远程抄表系统集信号采集、网络通信于一体的高性能抄表装置&#xff0c;该系统以485通讯方式读取水表电表的数据,以MBUS通讯方式读取…...

Android 通知

1. 原生Android通知的几种显示方式&#xff1a; 状态栏的图标&#xff1a;发出通知后&#xff0c;通知会先以图标的形式显示在状态栏中。 抽屉式通知栏&#xff1a;用户可以在状态栏向下滑动以打开抽屉式通知栏&#xff0c;并在其中查看更多详情及对通知执行操作。在应用或用户…...

【Unittest】Requests实现小程序项目接口测试

文章目录 一、搭建接口测试框架二、初始化日志三、定义全局变量四、封装接口五、编写测试用例六、生成测试报告 一、搭建接口测试框架 目录结构如下。 二、初始化日志 在utils.py文件中编写如下如下代码&#xff0c;初始化日志。 # 导入app.py全局变量文件 import app import l…...

Mac 搭建本地服务器

文章目录 一、启动服务器二、添加文件到本地服务三、手机/其他电脑 访问本机服务器 MacOS 自带Apatch 服务器。所以我这里选择Apatch服务器搭建 一、启动服务器 在safari中输入 http://127.0.0.1/ &#xff0c;如果页面出现 it works&#xff0c;则代表访问成功。启动服务器 …...

5个必知技巧:让你的PT下载效率提升300%的浏览器插件指南

5个必知技巧&#xff1a;让你的PT下载效率提升300%的浏览器插件指南 【免费下载链接】PT-Plugin-Plus PT 助手 Plus&#xff0c;为 Microsoft Edge、Google Chrome、Firefox 浏览器插件&#xff08;Web Extensions&#xff09;&#xff0c;主要用于辅助下载 PT 站的种子。 项…...

跨语言沟通的革命性突破:FunASR语音翻译系统全解析

跨语言沟通的革命性突破&#xff1a;FunASR语音翻译系统全解析 你是否还在为国际会议中的语言障碍而烦恼&#xff1f;是否因跨国团队协作中的沟通不畅而效率低下&#xff1f;FunASR语音翻译系统将彻底改变这一现状&#xff0c;让跨语言交流如母语般自然流畅。读完本文&#xf…...

ESFT-gate-law-lite:法律文本智能分析新工具

ESFT-gate-law-lite&#xff1a;法律文本智能分析新工具 【免费下载链接】ESFT-gate-law-lite ESFT-gate-law-lite是基于HuggingFace的深度学习模型&#xff0c;专为法律领域定制。源自deepseek-ai团队&#xff0c;继承ESFT-vanilla-lite优势&#xff0c;强大而轻量&#xff0c…...

日语零基础每天学习笔记【01-10】

第一天 日语五十音&#xff1a;平假名/片假名发音あア いイ うウ えエ おオaかカ きキ くク けケ こコkaさサ しシ すス せセ そソsaたタ ちチ つツ てテ とトtaなナ にニ ぬヌ ねネ のノnaはハ ひヒ ふフ へヘ ほホhaまマ みミ むム めメ もモmaや…...

2026微软SDE LeetCode高频题:208道,按频度排序,含备考建议

2026微软SDE LeetCode高频题&#xff1a;208道&#xff0c;按频度排序&#xff0c;含备考建议 微软SDE的LeetCode面试题&#xff0c;第一名不是反转链表&#xff0c;不是LRU缓存&#xff0c;而是—— 215. 数组中的第K个最大元素&#xff0c;出现14次。 我整理了基于真实面经…...

Huggingface模型离线加载失败?别慌,可能是.cache文件在捣鬼(附清理与修复指南)

Huggingface模型离线加载失败&#xff1f;别慌&#xff0c;可能是.cache文件在捣鬼&#xff08;附清理与修复指南&#xff09; 当你兴冲冲地在新环境部署好Huggingface模型&#xff0c;准备大展拳脚时&#xff0c;突然蹦出OSError: We couldnt connect to https://hf-mirror.co…...

免费降AI vs 付费降AI:省下的钱够不够你重新查重?

选降AI工具这件事&#xff0c;我前后折腾了大半个月。起因很简单&#xff1a;论文用DeepSeek写了初稿&#xff0c;知网一查AI率直接飙到90%多&#xff0c;导师让我三天内搞定。 先说结论&#xff1a;免费降AI率工具能用&#xff0c;但别指望它帮你一步到位。 我试了五六个免费…...

告别鉴权内耗,让每一位Java开发者都能轻松上手

写Java的这些年&#xff0c;无论是初入职场的新手&#xff0c;还是深耕多年的老兵&#xff0c;谁没在「鉴权」上栽过跟头&#xff1f; 熬夜啃Spring Security的复杂配置&#xff0c;对着一堆过滤器链抓耳挠腮&#xff1b;用Shiro做前后端分离项目&#xff0c;为了适配Token模式…...

PlugY:暗黑2单机玩家必备的生存工具包,开启无限可能游戏体验 [特殊字符]

PlugY&#xff1a;暗黑2单机玩家必备的生存工具包&#xff0c;开启无限可能游戏体验 &#x1f525; 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 还在为暗黑破坏神…...

League Akari:英雄联盟玩家的智能效率助手,提升90%游戏体验

League Akari&#xff1a;英雄联盟玩家的智能效率助手&#xff0c;提升90%游戏体验 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit …...