news 2026/4/16 12:54:12

【Linux 基础知识系列:第二百一十九篇】Bash 关联数组(字典)的使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Linux 基础知识系列:第二百一十九篇】Bash 关联数组(字典)的使用

一、简介:为什么必须学会关联数组?

在日常脚本开发中,我们经常会遇到“键-值”型数据:

  • 根据主机名找 IP

  • 根据用户名查邮箱

  • 统计每个 URL 的出现次数

使用普通数值索引数组arr[0]=alice)需要手工维护映射表,既麻烦又容易出错。
Bash 4.0 起内置关联数组(Associative Array),功能等价于其他语言的“字典(Dictionary)”或“Map”:

  • 键可以是任意字符串,不再局限于 0 1 2 …

  • 读写速度 O(1),脚本依然轻量

  • 无需额外安装软件,比外部调用 awk/sed 更快速、可读性更高

掌握关联数组,让你的脚本从“玩具级”跃升到“工程级”。


二、核心概念:一张表看懂关联数组

术语说明示例
关联数组键→值 的映射表declare -A site=( [google]="216.58.200.46" )
键(key)唯一字符串google
值(value)任意字符串216.58.200.46
声明告诉 Bash 这是关联数组declare -A arr
遍历逐个访问键/值for key in "${!arr[@]}"

注意: Bash 3 及以下不支持,macOS 默认 Bash 3 需brew install bash


三、环境准备:2 分钟搞定

  1. 检查版本

    bash --version | head -1 # ≥ 4.0 即可
  2. 若 < 4.0(CentOS 7、macOS 默认)

    # CentOS sudo yum install -y bash # macOS brew install bash
  3. 进入实验目录

    mkdir -p ~/bash-dict && cd ~/bash-dict

四、命令与示例:从定义到遍历,一站式 copy & run

以下脚本均保存为demo.sh,直接chmod +x demo.sh && ./demo.sh即可看到结果。


4.1 声明与赋值

#!/usr/bin/env bash # demo1.sh declare -A config # ① 声明关联数组 config[host]="192.168.1.10" # ② 赋值 config[user]="root" config[port]="22" echo "主机=${config[host]}" # ③ 读取 echo "用户=${config[user]}"

输出:

主机=192.168.1.10 用户=root

4.2 一次批量赋值(花括号法)

#!/usr/bin/env bash # demo2.sh declare -A color=( [red]="#FF0000" [green]="#00FF00" [blue]="#0000FF" ) echo 红色代码=${color[red]}

4.3 安全读取:防未定义键

#!/usr/bin/env bash # demo3.sh declare -A cfg cfg[timeout]=30 # 如果键不存在返回默认值 timeout=${cfg[timeout]:-60} # ← 60 是默认值 echo "超时时间=$timeout"

4.4 遍历键与值

#!/usr/bin/env bash # demo4.sh declare -A score=( [alice]=90 [bob]=80 [carol]=85 ) # 遍历键 for name in "${!score[@]}"; do echo "$name 分数是 ${score[$name]}" done

技巧:

  • "${!score[@]}"取全部键

  • "${score[@]}"取全部值

  • 顺序与插入顺序无关(哈希实现)


4.5 计数器:统计单词出现次数

#!/usr/bin/env bash # demo5.sh declare -A counter while read -r word; do ((counter[$word]++)) # 不存在时自动初始为 0 done < <(echo "apple apple banana apple") for w in "${!counter[@]}"; do echo "$w 出现了 ${counter[$w]} 次" done

输出:

apple 出现了 3 次 banana 出现了 1 次

4.6 修改与删除

#!/usr/bin/env bash # demo6.sh declare -A site site[google]="216.58.200.46" # 修改 site[google]="142.250.185.78" echo "新 IP=${site[google]}" # 删除 unset site[google] [[ -v site[google] ]] && echo "仍存在" || echo "已删除"

4.7 长度与判空

echo "键数量=${#config[@]}" [[ ${#config[@]} -eq 0 ]] && echo "数组为空"

4.8 嵌套模拟(二维键)

Bash 不支持真正的二维数组,可用拼接键技巧:

declare -A matrix matrix[1,1]=10 matrix[1,2]=20 echo "${matrix[1,2]}" # 输出 20

4.9 与配置文件联动:一行导入

# config.txt 内容: # host=192.168.1.10 # user=root # port=22 declare -A cfg while IFS='=' read -r key value; do cfg[$key]=$value done < config.txt echo "导入完成,主机=${cfg[host]}"

4.10 函数返回值:返回字典

# 返回多个值的最佳实践 function get_dbinfo() { local -A db db[host]="localhost" db[port]=3306 db[user]="admin" # 打印键值对,调用者用 eval 重建 for k in "${!db[@]}"; do echo "$k=${db[$k]}" done } # 调用端 declare -A dbinfo while IFS='=' read -r k v; do dbinfo[$k]=$v done < <(get_dbinfo) echo "数据库端口=${dbinfo[port]}"

五、常见问题与解答(FAQ)

问题现象解决
declare -A报错“invalid option”Bash < 4.0升级 Bash,brew install bash/yum install bash
键顺序乱与插入顺序不同关联数组底层哈希,排序用 `for k in (printf′{!arr[@]}"sort)`
空格被截断arr[key]=val ue双引号包裹:arr[key]="val ue"
变量未定义却返回 0((${counter[$word]}++))这是预期行为;若需严格判空先用[[ -v counter[$word] ]]
macOS 默认 sh 不支持#!/bin/sh失败shebang 写#!/usr/bin/env bash且确保新 bash 路径在/etc/shells

六、实践建议与最佳实践

  1. 统一封装:把常用读配置写成函数,避免全局变量污染。

  2. 默认安全:读取加:-默认值,脚本在 CI 里更健壮。

  3. 大文件提速:>10 万键时,用外部 SQLite;Bash 数组仍轻量,但别滥用。

  4. 命名规范:全大写表示常量,例declare -A CONFIG=()

  5. 调试技巧

    declare -p arr # 打印完整键值对,排错神器
  6. 兼容考虑:若脚本需支持 Bash 3,回退到awk关联数组,但放弃 Bash 原生。


七、总结:一张脑图带走全部要点

Bash 关联数组 ├─ 声明:declare -A arr ├─ 赋值:arr[key]=val / 批量 ( [k]=v ) ├─ 读取:${arr[key]} / ${arr[key]:-default} ├─ 遍历:for k in "${!arr[@]}" ├─ 计数:((arr[key]++)) └─ 技巧:config 文件一键导入、函数返回字典

掌握关联数组,你的脚本就能:

  • 30 行写完过去需要awk + grep100 行的配置解析

  • 让 CI 流水线、自动部署脚本易读、易维护、易扩展

  • 无外部依赖的嵌入式环境,也能享受“字典”级数据结构

现在就打开终端,复制第 4.5 节的计数器脚本跑一遍——Bash 也有现代数据结构,只是你还没开始用!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 9:38:48

微软官方出品!电脑管家实用指南:低占用 + 强防护,纯净无捆绑

如今电脑安全辅助软件五花八门&#xff0c;不少工具要么捆绑安装冗余程序&#xff0c;要么后台占用过高拖慢系统&#xff0c;想找一款干净、靠谱的管理工具并不容易。而微软作为 Windows 系统的研发方&#xff0c;推出的官方工具 —— 微软电脑管家&#xff0c;凭借系统底层适配…

作者头像 李华
网站建设 2026/4/16 11:03:56

虚拟偶像内容生产:IndexTTS 2.0生成高相似度粉丝向语音

虚拟偶像内容生产&#xff1a;IndexTTS 2.0生成高相似度粉丝向语音 在虚拟偶像产业飞速发展的今天&#xff0c;一个核心问题始终困扰着内容创作者&#xff1a;如何让AI“说”出真正属于那个角色的声音&#xff1f;不是机械复读&#xff0c;也不是音色模糊的模仿&#xff0c;而是…

作者头像 李华
网站建设 2026/4/16 10:56:03

【R语言交叉验证实战指南】:掌握高效模型评估的5大核心技巧

第一章&#xff1a;R语言交叉验证的核心概念与意义 交叉验证是评估统计模型泛化能力的重要技术&#xff0c;尤其在R语言中被广泛应用于机器学习与数据建模领域。其核心思想是将数据集划分为多个子集&#xff0c;通过反复训练和验证来减少模型评估的偏差与方差&#xff0c;从而更…

作者头像 李华
网站建设 2026/4/15 23:39:06

旅游宣传片配音:用IndexTTS 2.0营造沉浸式氛围

旅游宣传片配音&#xff1a;用IndexTTS 2.0营造沉浸式氛围 你有没有过这样的体验&#xff1f;一段精心剪辑的海南风光视频&#xff0c;画面美得令人屏息——海浪轻拍沙滩&#xff0c;阳光穿透椰林&#xff0c;镜头缓缓掠过潜水者的身影。可旁白一出声&#xff0c;机械感十足的“…

作者头像 李华
网站建设 2026/4/16 12:23:53

AI翻译工具终极指南:实现游戏无障碍的完整解决方案

AI翻译工具终极指南&#xff1a;实现游戏无障碍的完整解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 还在为外语游戏中的语言障碍而烦恼吗&#xff1f;&#x1f3ae; 今天我要为你介绍一款革命性…

作者头像 李华
网站建设 2026/4/16 2:00:01

Blender 3MF插件终极指南:轻松搞定3D打印模型转换

Blender 3MF插件终极指南&#xff1a;轻松搞定3D打印模型转换 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 还在为3D模型在不同软件间转换而烦恼吗&#xff1f;Blender…

作者头像 李华